遞迴求解漢諾塔問題
- 資料結構習題解析・鄧俊峰 課後習題
問題
有三根杆子A,B,C。A杆上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C杆:
- 每次只能移動一個圓盤
- 大盤不能疊在小盤上面
提示:可將圓盤臨時置於B杆,也可將從A杆移出的圓盤重新移回A杆,但都必須遵循上述兩條規則。
問:如何移?最少要移動多少次?
問題分析
- 具體分析網上有個部落格解釋的十分詳盡,我自認不能比他解釋的更清楚,所以在此貼一下他的地址: 漢諾塔的理解
要把圓盤移至C杆,我們可以分為以下步驟:
- 先把堆在A杆上的前n-1根藉助C杆移到B杆上
- 再把A杆上剩餘的最後一個移到C杆上
- 最後再把B杆上的n-1個盤藉助A杆移到C上
- 當碟子為0時遞迴結束
程式碼:
#include <iostream>
using namespace std;
/* diskNums 盤子數量,init 初始杆名稱,temp 臨時杆名稱,dest 目標杆名稱 */
void hanoi(int diskNums, string init, string temp, string dest);
void move(int diskNums, string init, string dest);
int main(int argc, const char * argv[]) {
hanoi(3, "A", "B", "C");
return 0;
}
void hanoi(int diskNums,string init,string temp,string dest){
if (diskNums>0) {
hanoi(diskNums-1, init, dest, temp);
move(diskNums, init, dest);
hanoi(diskNums-1, temp, init, dest);
}
}
void move(int diskNums, string init, string dest){
cout<<"No."<<diskNums<<" disks from "<<init<<" to "<<dest<<endl;
}
執行結果
No.1 disks from A to C
No.2 disks from A to B
No.1 disks from C to B
No.3 disks from A to C
No.1 disks from B to A
No.2 disks from B to C
No.1 disks from A to C
Program ended with exit code: 0
複雜度分析
由遞迴的基本條件推出遞推式:
T(1) = O(1) 對應 if(n>0),遞迴基
T(n) = 2*T(n-1) + O(1)
對應下面這三個函式
hanoi(diskNums-1, init, dest, temp);
move(diskNums, init, dest);
hanoi(diskNums-1, temp, init, dest);
S(n) = T(n) + O(1) = 2*T(n-1) + 2*O(1)
S(n-1) = T(n-1) + O(1)
S(n) = 2*S(n-1)
= 2^2*S(n-2)
......
= 2^n-1*S(1)
= 2^n
故有 T(n) = O(2^n)
相關文章
- 遞迴-*漢諾塔遞迴
- python3:遞迴解漢諾塔問題Python遞迴
- 漢諾塔和遞迴遞迴
- 課時24:遞迴:漢諾塔遞迴
- 第二章 :查詢與排序-------遞迴經典問題——漢諾塔問題排序遞迴
- 漢諾塔的圖解遞迴演算法圖解遞迴演算法
- 從漢諾塔遊戲理解python遞迴函式遊戲Python遞迴函式
- Python實現:漢諾塔問題Python
- 樹遞迴問題的求解遞迴
- 奇怪的漢諾塔 - 題解
- SQL 漢諾塔SQL
- 漢諾塔-PythonPython
- 【YbtOJ高效進階 遞推-2】奇怪漢諾塔
- 漢諾塔詳解
- ch2_8_3求解迴文序列問題(遞迴實現)遞迴
- JAVA漢諾塔遞迴 之SpringCloud企業分散式微服務雲架構快速開發平臺Java遞迴SpringGCCloud分散式微服務架構
- 遞迴問題遞迴
- 小知識系列(3):Hanoi塔(漢諾塔,河內塔)
- 漢羅塔問題 java實現Java
- PHP實現漢諾塔演算法PHP演算法
- 漢諾塔遊戲《演算法很美》遊戲演算法
- 遞迴路徑問題遞迴
- 遞迴-*全排列問題遞迴
- 【組合數學】遞推方程 ( 有重根遞推方程求解問題 | 問題提出 )
- hdu2048遞迴問題遞迴
- hdu2049遞迴問題遞迴
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- 遞迴解決全排列問題遞迴
- [演算法練習及思路-程式設計師面試金典(Java解法)]No46.漢諾塔問題演算法程式設計師面試Java
- 分治法求解問題
- 資料結構學習筆記-遞迴求解森林高度資料結構筆記遞迴
- 手把手教你用java實現資料結構(五)-----查詢(二分法),遞迴(斐波那契數列,漢諾塔)演算法Java資料結構遞迴演算法
- 請教一個切片遞迴賦值的問題遞迴賦值
- 邏輯迴歸求解二分類問題以及SPSS的實現邏輯迴歸SPSS
- 漢諾塔與二進位制、滿二叉樹的千絲萬縷二叉樹
- 遞迴中的遞推與迴歸以及返回值和函式儲存的問題(以階乘問題進行討論)遞迴函式
- python+gurobi求解排班問題Python
- NP難問題求解綜述