演算法:
1, 從目標出發,我們將n個盤子從a移動到b通過c,假如我們這樣寫
hanoi(n, a, b, c);
2, 同理,我們也就可以知道,將n-1個盤子從a移動到b通過c,即就是:
hanoi(n-1, a, b, c);
3, 但是我們知道我們一次只能移動乙個盤子,所以,如果我們要將n個盤子從a移動到b通過c,我們可以將其分解為三步(對其進行遞迴,從難到易,知道移動完最後乙個然後退出程式):
1,我們先將n-1個盤子從a移動到c通過b: hanoi(n-1, a, c, b);
2,然後我們就可以先將第n個盤子從a移動到b: move(n, a, b);
3,最後我們再將n-1個盤子從c移動到b通過a: hanoi(n-1, c, b, a);
程式:
#include void move(int n , char a, char b)
void hanoi(int n, char a, char b , char c)
int main()
hanoi(n, 'a', 'b', 'c');
return 0;
}
執行結果:
值得注意的是:
我們寫的程式應該能經得起一般的驗證,
當直接寫這個函式:
hanoi(3, 'a', 'b', 'c');
使用者只能看到移動3個盤子的情況,不能驗證其他情況,這樣真的好嗎??
當n是由使用者自己輸入的情況下,那麼可能會出現一些非法的情況,如n的輸入值為負或者0的情況呢??
所以,我們應該讓我們的程式魯棒行強一點,讓我們一起養成好習慣吧!!!
帶你理解 Hanoi 漢諾塔遞迴演算法
一.由遊戲引發的 hanoi 問題 漢諾塔是根據乙個傳說形成的乙個問題。漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著 64 片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,...
漢諾塔問題 hanoi(遞迴)
漢諾塔問題 hanoi 現有abc三個柱子,a中有n個盤 上小下大 移動到c上,要求全程上小下大 演算法 遞迴,把1 n 1個盤當作乙個整體 include 函式宣告 函式功能 把n個盤 從a 借助b,移到c hanoi int n,char x,char y,char z 函式功能 把乙個盤子x ...
漢諾塔問題(Hanoi塔)
1.將from柱最上面的movesum 1個圓盤移動到by柱 借助to柱 2.將from柱上剩下的那1個圓盤直接移動到to柱 3.將by柱上的movesum 1個圓盤移動到to柱 借助from柱 int sumofplates 4 總的盤子數目 int sum 3 初始時各柱子上盤子數目 enum ...