遞歸漢諾塔

来源: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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...