汉诺塔——递归算法
一.起源:
漢諾塔(又稱河內塔)問題是源于印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
二.抽象為數學問題:
如下圖所示,從左到右有A、B、C三根柱子,其中A柱子上面有從小疊到大的n個圓盤,現要求將A柱子上的圓盤移到C柱子上去,期間只有一個原則:一次只能移到一個盤子且大盤子不能在小盤子上面,求移動的步驟和移動的次數
三、算法分析
如何實現移動圓盤的操作呢??可以用分治求解的遞歸方法來解決這個問題。設A柱上最初的圓盤總數為n,當n=1的時候只要將編號為1的圓盤從塔座A直接移到塔座C上即可;否則,執行以下的的三步:
1、用C柱作為過渡,將A柱上的(n-1)個盤子移到B柱上來;
2、將A柱上最后一個盤子直接移到C柱上;
3、然后再將B柱上的(n-1)個盤子移到C柱上,用A柱作為過渡;
源代碼:
#include <iostream> using namespace std; int m = 0; void move( char A,int n, char C) {cout <<++m<< "--第"<<n << "塊:" << A << "-->" << C<< endl; } void hanoi(int n, char A, char B, char C) {if (n == 1)move(A, 1, C);else{hanoi(n - 1,A, C, B);move(A, n, C);hanoi(n - 1, B, A, C);} } int main() {int n;cout<<"請輸入漢諾塔的層數:";cin >> n;getchar();hanoi(n ,'a','b','c');getchar();return 0; }運行結果:
其實這個小型的游戲就是用到了遞歸的算法,而遞歸實際上的操作就是對棧的操作,棧都是先進后出。
擴展:如果想進一步了解棧如何操作的話,可以試著解決八皇后和迷宮等問題。有助于大家了解更多遞歸的操作。
如果大家對C/C++感興趣的話,本小編這里準備了一大堆的學習資料可以免費分享給有需要的朋友們,學習群:前面八七三,中間五二一,后面八零三。連起來就可進群然后免費領取一份學習資料哦!!!!
總結
- 上一篇: 教育编程语言(转)
- 下一篇: zoj 1078 palindrom n