遞歸漢諾塔

来源:http://www.cnblogs.com/robin-xu/archive/2016/02/06/robinxu.html
-Advertisement-
Play Games

/*漢諾塔的玩法: * 游戲的規則:將A柱上的盤子移動到C柱上,大盤必須在小盤之上。 * 1 當A柱上只有一個盤子的時候,直接移動到C柱上; * 2 當A柱上有兩個盤子的時候, * 將A柱上的1盤(從上到下編號)移動到B柱, * 將A柱上的2盤移動到C柱, * 將B柱上的1盤移動到C柱; * (將A


/*漢諾塔的玩法:  * 游戲的規則:將A柱上的盤子移動到C柱上,大盤必須在小盤之上。  * 1 當A柱上只有一個盤子的時候,直接移動到C柱上;  * 2 當A柱上有兩個盤子的時候,  *   將A柱上的1盤(從上到下編號)移動到B柱,  *   將A柱上的2盤移動到C柱,  *   將B柱上的1盤移動到C柱;  *   (將A上的1~n-1盤---->B柱,將A柱上n---->C柱,B柱上的1~n-1盤---->C柱)  * 3 當A柱上有三個盤子的時候,將A柱上的1~2盤移動到B柱,  *   將A柱上的3盤移動到C柱,  *   將B柱上的1~2盤移動到C柱  *   (將A上的1~n-1盤---->B柱,將A柱上n---->C柱,B柱上的1~n-1盤---->C柱)  * n 當A柱上有n個盤子的時候,將A柱上的1~n-1盤移動到B柱,  *   將A柱上的n盤移動到C柱,  *   將B柱上的1~n-1盤移動到C柱。  *   (將A上的1~n-1盤---->B柱,將A柱上n---->C柱,B柱上的1~n-1盤---->C柱)  * */  
 1 #include<stdio.h>
 2  
 3 void Hanoi(int count,char a,char b,char c){
 4   if(count == 1){
 5     printf("FROM %c TO %c\n",a,c);
 6   }else
 7   {
 8     Hanoi(count-1,a,c,b);
 9     printf("FROM %c TO %c\n",a,c);
10     Hanoi(count-1,b,a,c);
11   }
12 }
13 int main(){
14   printf("please input the number of Hanoi:");
15   int n;
16   scanf("%d",&n);
17   Hanoi(n,'A','B','C');
18   return 0;
19 }

 

通常系統通常在一個函數運行期間調用另一個函數時,在運行被調用的函數之前,系統需要做3件事:(1)將所有的實參,返回地址等信息傳遞給被調用的函數保存。(2)為被調用的函數的局部變數分配存儲區。(3)將控制轉到被調用的函數的入口。從而在被調用的函數返回調用函數之前,系統通常也要做3件事:(1)保存被調函數的計算結果(2)釋放被調函數的數據區(3)依照被調函數保存的返回地址將控制返回到調用函數。當有多個函數嵌套調用,按照先調用的後返回的原則,上述函數之間的信息傳遞和控制的轉移必須必須通過棧來實現,即系統見整個程式運行期間的所需要的數據空間安排在一個棧中,每當調用一個函數就為它在棧頂分配一個存儲區,每當一個函數退出運行時,就釋放他的存儲區,則當前正在運行的函數的數據必須是在棧頂的。遞歸函數的執行過程相當於多個韓式的嵌套調用,只是調用函數和被調用的函數是同一個函數。為了保證遞歸函數的正確進行,系統設立了一個遞歸工作棧作為真個遞歸函數運行期間使用的數據存儲區,每一層遞歸所需的信息構成一個“工作記錄”。其中包括所有的上一層的返回地址,所有的局部變數和實在的參數。每當進入一層遞歸,就產生一個新的工作記錄壓入棧頂,每當退出一層遞歸,就從棧頂彈出一項工作記錄。

void Hanoi(int count,char a,char b,char c)

1  {

2     if(count == 1)

3        printf("FROM %c TO %c\n",a,c);

4     else{

5        Hanoi(count-1,a,c,b);

6        printf("FROM %c TO %c\n",a,c);

7        Hanoi(count-1,b,a,c);

8     }

9  }

 下表給出了遞歸的執行過程,返回地址是程式中的代碼的行號,主函數的地址為0;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先從u-boot官網下載最新版的u-boot,這裡我下的是u-boot-2015.10。下載完成後解壓,閱讀README,在Building the Software:中得知編譯方法:如果使用交叉編譯的話要執行以下命令: CROSS_COMPILE=arm-linux- export CROSS_
  • 上一篇,純粹玩 ESP8266,寫入了 init.lua 能收發 UDP。這次拿 BBB 開刀,用 BBB host 一個 web server ,用於與用戶交互,數據來自 ESP8266 的 UDP 交互結果。本來,ESP8266 能直接用 TCP,但我希望廣播 UDP 來做自動發現,那服務端和設...
  • 本文原創,原文地址為:http://www.cnblogs.com/fengzheng/p/5181222.html 創建鏡像的目的 首先說DockerHub或其它一些鏡像倉庫已經提供了夠多的鏡像,有最小版本,也有一些安裝了mysql、nginx、apache等等第三方軟體的版本可以直接拿來使用。雖
  • 1.Niginx主配置文件參數詳解 a.上面博客說了在Linux中安裝nginx。博文地址為:http://www.cnblogs.com/hanyinglong/p/5102141.html b.當Nginx安裝完畢後,會有相應的安裝目錄,安裝目錄里的nginx.confg為nginx的主配置文件
  • 前段時間,項目中有個需求,需要將linux和windows的時間進行同步,網上也有很多類似時鐘同步的帖子,大致類似;不過本次的linux的機器有點特殊,沒有service命令,而且要求在另一臺suse的linux機器上通過腳本連接到目的linux機器進行時鐘同步。起先我也被困擾的很久,不過辦法都是人
  • 類的繼承,是在父類中存在可繼承的成員A,而在子類中不存在同名成員,這樣該成員會被繼承到子類,當子類對象訪問該成員時,實際訪問的是父類的對應成員。類的重寫,是在父類中存在可繼承的成員A,而在子類中存在同名成員,這樣該成員會被子類重寫,當子類對象訪問該成員時,實際訪問的是子類的成員。所以二者的區別就是,
  • 在節前的最後一天,解決了打包過程中遇到的所有問題,可以成功運行了!真是個好彩頭,希望新的一年一切順利! 以下是在使用cx_freeze過程中遇到的問題及解決辦法(Win7) 問題描述:運行exe,啟動無數個主程式,導致系統無法使用 原因:在程式中使用了multiprocessing的包 解決辦法:在
  • package CommonClassPart; import java.io.File; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class Common
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...