C語言中的遞歸問題——漢諾塔問題

????????漢諾塔(Tower of Hanoi),又稱河內塔,是一個源于印度古老傳說的益智玩具。傳說大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

求解思路:
三根柱子(標記為 A、B、C),在柱子 A 上有從小到大疊放的n個圓盤,要將這n個圓盤從柱子 A 借助柱子 B 全部移動到柱子C上,移動過程中需要遵循以下規則:
1.每次只能移動一個圓盤。
2.大圓盤不能放在小圓盤上面。

代碼實現及解析:

#include <stdio.h>//將src座上的n個盤子,以mid座為中轉,移動到dest座
void hanoi(int n, char src, char mid, char dest)
{//src:通常代表“source”,意思是起點或源。//dest:通常代表“destination”,意思是終點或目標。//mid:可能代表“middle”,意思是中間點或中間節點。if (n == 1)//只需移動一個盤子{//直接將盤子從src移動到dest即可printf("%c->%c ", src, dest);return;}hanoi(n - 1, src, dest, mid);//先將n-1個盤子從src移動到midprintf("%c->%c ", src, dest);//再將一個盤子從src移動到desthanoi(n - 1, mid, src, dest);//最后將n-1個盤子從mid移動到dest
}int main()
{int number = 0;scanf("%d",&number);hanoi(number,'A','B','C');printf("\n");return 0;
}//跟后文的代碼的區別在于,在n==1時,如果不執行return語句終止函數,就會依次執行后面三行代碼(我們不希望執行后面三行代碼)。而后文那個代碼形式,如果n==1,else里面的代碼就不執行了。

補充上面代碼中“void hanoi(int n, char src, char mid, char dest)”函數中的return語句的解釋:

????????void函數明確表示該函數不返回任何值。

1. 核心規則

????????在C語言中,將一個函數的返回類型聲明為?void,就是告訴編譯器和程序員:“這個函數執行一些操作,但不會產生一個可供使用的返回值。” 因此,在?void?函數中使用?return?語句來返回一個值是非法的,會導致編譯錯誤。

2.?return?語句在?void?函數中的用法(可選)

????????雖然不能返回一個值,但你仍然可以在?void?函數中使用?return?語句。它的作用不再是返回值,而是立即終止函數的執行,提前從函數中退出。

這在某些條件下提前結束函數執行的場景中非常有用。

更多代碼實現(功能一樣,代碼有細微區別):

#include <stdio.h>//將src座上的n個盤子,以mid座為中轉,移動到dest座
void hanoi(int n, char src, char mid, char dest)
{//src:通常代表“source”,意思是起點或源。//dest:通常代表“destination”,意思是終點或目標。//mid:可能代表“middle”,意思是中間點或中間節點。if (n == 1)//只需移動一個盤子{//直接將盤子從src移動到dest即可printf("%c->%c ", src, dest);}else{hanoi(n - 1, src, dest, mid);//先將n-1個盤子從src移動到midprintf("%c->%c ", src, dest);//再將一個盤子從src移動到desthanoi(n - 1, mid, src, dest);//最后將n-1個盤子從mid移動到dest}
}int main()
{int number = 0;scanf("%d",&number);hanoi(number,'A','B','C');printf("\n");return 0;
}//跟前文的代碼的區別在于,如果n==1,else里面的代碼就不執行了。前文那個代碼形式,在n==1時,如果不執行return語句終止函數,就會依次執行后面三行代碼(我們不希望執行后面三行代碼);
#include <stdio.h>void move(char from, char to)
{printf("%c->%c", from, to);
}//將src座上的n個盤子,以mid座為中轉,移動到dest座
void hanoi(int n, char src, char mid, char dest)
{    //src:通常代表“source”,意思是起點或源。//dest:通常代表“destination”,意思是終點或目標。//mid:可能代表“middle”,意思是中間點或中間節點。if (n == 1)//只需移動一個盤子{//直接將盤子從src移動到dest即可move( src, dest);}else{hanoi(n - 1, src, dest, mid);//先將n-1個盤子從src移動到midmove(src, dest);//再將一個盤子從src移動到desthanoi(n - 1, mid, src, dest);//最后將n-1個盤子從mid移動到dest}
}int main()
{int number = 0;scanf("%d",&number);hanoi(number,'A','B','C');printf("\n");return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/99115.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/99115.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/99115.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ArkAnalyzer源碼初步分析I——分析ts項目流程

1.前言&#xff1a; 鴻蒙程序分析框架ArkAnalyzer&#xff08;方舟分析器&#xff09; 源碼地址 入門文檔 2.閱讀入門文檔后&#xff1a; 本人具有一定的Java開發經驗。雖然我對 TypeScript&#xff08;TS&#xff09;和 ArkTS 還不熟&#xff0c;但很多概念對我這個 Java 開…

c#基礎二(類和對象,構造器調用順序、訪問級別、重寫和多態、抽象類和接口)

一、類1.0對象初始化器class Student {public String name;public int age { get; set; } } internal class Program {static void Main(string[] args){ //寫法一Student stunew Student();stu.name"Tom";stu.age20;//寫法二Student stu2 new Student { name &qu…

Qt之快捷鍵、事件處理、自定義按鍵——完成記事本項目

快捷鍵我們電腦中的記事本中還支持快捷鍵&#xff0c;如“CTRLO”打開文件、“CTRLS”保存文件在Qt中使用QShortcut這個類創建快捷鍵在.cpp文件的構造函數中創建QShortcut對象&#xff0c;綁定打開文件和保存文件的槽函數放大縮小字體還是在.cpp的構造函數中編寫代碼Widget::Wi…

Open cascade中如何使用BRepAlgoAPI_Splitter分割一個Face

理論介紹 在OpenCASCADE幾何建模內核中&#xff0c;BRepAlgoAPI_Splitter是一個強大的工具&#xff0c;用于將一個形狀&#xff08;Shape&#xff09;用另一個形狀&#xff08;Tool&#xff09;進行分割。這種操作在CAD建模中非常常見&#xff0c;比如用平面切割實體、用曲線分…

【醫療 AI】Baichuan-M2 醫療大模型:技術解讀與使用方法

【醫療 AI】Baichuan-M2 醫療大模型&#xff1a;技術解讀與使用方法1. Baichuan-M2 醫療大模型簡介1.1 基本信息1.2 下載地址1.3 技術特點2. Baichuan-M2 模型技術報告2.1 摘要2.2 醫學性能評估2.2.1 HealthBench基準2.2.2 中國醫療場景對比評估2.3 系統架構2.3.1 驗證器系統2.…

unity pcd 二進制版 簡單顯示文件對象(單色)

unity Point Cloud Viewer and Tool 那個插件不支持pcd二進制&#xff0c;而且網上到處都是AI 我恨這種AI濫用&#xff0c;提供不了一點價值 好了&#xff0c;言歸正傳 可以在Point Cloud Viewer and Tool這個插件報錯地方轉用這個代碼&#xff0c;具體咋結合請自行研究。 …

強大的開源文檔問答工具-Kotaemon

Kotaemon 是一個基于 RAG&#xff08;Retrieval-Augmented Generation&#xff09;架構的開源文檔問答工具&#xff0c;為用戶提供與文檔對話的智能交互體驗。該項目同時服務于終端用戶和開發者&#xff0c;具有高度的可擴展性和定制化能力。技術棧分析核心技術棧后端框架Pytho…

區塊鏈:搭建簡單Fabric網絡并調用智能合約

使用docker服務搭建Hyperledger/fabric網絡的詳細教程&#xff0c;實現構建多節點的簡單聯盟鏈&#xff0c;并編寫、調用智能合約實現投票業務。 目錄 背景知識 Hyperledger Fabric 基本組件 交易(Transaction) 智能合約 實驗目的 實驗環境 基礎依賴 安裝Golang 安裝do…

Web前端面試題(2)

Web前端面試題(附答案及解析)&#xff08;2025.9月最新版&#xff09;-CSDN博客 1.link 與 import 的區別和用法 主要區別 特性<link>import語法類型HTML標簽CSS規則加載方式并行加載&#xff08;與其他資源同時加載&#xff09;串行加載&#xff08;必須等待主CSS文件…

Paxos協議

目錄 Paxos 是什么&#xff08;What&#xff09; Paxos 的目的&#xff08;Why&#xff09; 角色與職責&#xff08;Who&#xff09; 基本流程&#xff08;How&#xff09; 常見問題與對策 什么是多數派&#xff08;Quorum&#xff09; Paxos vs Raft 異同點 Paxos 是什…

第十二篇:Qcom Camx打印實時幀率 FPS

一、第一種方式(有些低平臺可能沒有) adb shell setprop persist.vendor.camera.enableFPSLog TRUE adb shell setprop persist.vendor.camera.systemLogEnable TRUE adb shell setprop vendor.debug.camera.overrideLogLevels 0xff chi-cdk/core/chiframework/chxextensi…

TRAE通用6A規則+敏捷開發5S規則

網上研究別人的一些規則,也搞一份給大家 6A工作流項目規則 身份定義 你是一位資深的軟件架構師和工程師,具備豐富的項目經驗和系統思維能力。你的核心優勢在于: 上下文工程專家:構建完整的任務上下文,而非簡單的提示響應 規范驅動思維:將模糊需求轉化為精確、可執行的規…

【Nginx開荒攻略】Nginx主配置文件結構與核心模塊詳解:從0到1掌握nginx.conf:

目錄 引言 1 nginx.conf的整體結構 2 main全局塊詳解 2.1 核心指令解析 2.1.1 user&#xff1a;運行用戶 2.1.2 worker_processes&#xff1a;工作進程數 2.1.3 pid&#xff1a;PID文件路徑 2.1.4 worker_rlimit_nofile&#xff1a;文件描述符限制 2.2 main塊配置示例…

【前端教程】從基礎到優化:一個登錄頁面的完善過程

最近做了一個簡單的登錄頁面,主要練習了文本框的onfocus與onblur事件的使用。雖然功能實現了,但仔細想想還有不少可以改進的地方。今天就來分享一下這個登錄頁面的開發過程和優化思路。 初始實現與解析 先來看一下最初的實現代碼: <!DOCTYPE html> <html> &l…

獨家 | 抖音生活服務調整:涂晴接管市場和達人運營,旭凱擔任北部大區負責人

文/刀客doc(頭條精選作者)刀客doc獨家獲悉&#xff0c;9月8日抖音生活服務完成新一輪組織調整&#xff0c;并已在內部all hands完成官宣。此次調整主要涉及北部大區、達人運營與市場部三大條線的人事輪換與匯報關系變更。核心變動如下&#xff1a;涂晴&#xff0c;原抖音生活服…

class_9:java 抽象類和接口

抽象類 需要用abstract 修飾類和接口abstract class Person{String address;String name;abstract public void eat();abstract public void drink();public void printInfo(){System.out.println("name " name);}} class Student extends Person{public void eat()…

【C++】隊列queue的使用

語法 在 C 中&#xff0c;隊列的語法如下&#xff1a; #include <queue>// 聲明隊列 std::queue<Type> q;這里 Type 是隊列中存儲元素的數據類型。 常用操作 隊列提供了以下常用操作&#xff1a; empty(): 檢查隊列是否為空。 size(): 返回隊列中的元素數量。 fron…

HTTP 協議的基本格式

目錄 &#xff08;一&#xff09;HTTP是什么 &#xff08;二&#xff09;報文格式 &#xff08;1&#xff09;請求 ①首行 1.URL 2.方法&#xff08;method&#xff09; Ⅰ.GET Ⅱ.POST Ⅲ.PUT Ⅳ.DELETE 3.版本號 ②請求頭&#xff08;header&#xff09; 1.鍵值對…

計算機網絡的基本概念-2

1、數據交換技術&#xff1a;電路交換、報文交換與分組交換網絡核心部分的關鍵設備是路由器&#xff0c;其工作方式是分組交換。要理解分組交換&#xff0c;必須先了解其前兩種技術。1. 電路交換 (Circuit Switching)核心思想&#xff1a;通信前必須預先建立一條專用的物理通路…

車載網絡技術--SOME_IP協議詳解

文章目錄前言SOME/IP概念SOME/IP協議格式SOME/IP功能介紹序列化序列化規則發布和訂閱服務發現&#xff08;SOME/IP-SD&#xff09;SOME/IP-TP協議使用場景SOME/IP-TP協議參考文章&#xff1a;前言 本文介紹了SOME/IP協議的具體內容&#xff0c;包括報文格式&#xff0c;協議選…