漢諾塔問題的遞迴和非遞迴演算法

2021-06-20 03:44:23 字數 1456 閱讀 3187

漢諾塔問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片**圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。

如果考慮一下把64片金盤,由一根柱子上移到另一根柱子上,並且始終保持上小下大的順序。這需要多少次移動呢?這裡需要遞迴的方法。假設有n片,移動最少次數是f(n).顯然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此後不難證明f(n)=2^n-1。

在本文中,將討論用遞迴和非遞迴的方法來解決漢諾塔問題。

1、 通過遞迴實現漢諾塔問題的求解

設f(n)為將n片圓盤所在塔全部移動到另一塔最少總次數;由遞迴演算法可知:f(1) = 1;當n>1時,f(n)   = f(n-1) +  1 + f(n-1)。f(n) = 把上面n-1片圓盤移動到中間塔最少總次數f(n-1) + 把第n片圓盤移動到目標塔+ 把中間盤的n-1片圓盤移動到目標塔最少總次數為f(n-1)。由數學計算可得:f(n)=2^n-1。(n>0)。此演算法的遞迴**實現如下所示:

#include #include #includeusing namespace std;

void move(int n,char x,char y)

int pop()//出棧

void push(int x)//入棧

} ;

long pow(int x, int y); //計算x^y

void creat(st ta, int n); //給結構陣列設定初值

void hannuota(st ta, long max); //移動漢諾塔的主要函式

int main(void)

void creat(st ta, int n)

else}}}

3、 實驗結果及分析(測試時以7階漢諾塔為例)使用遞迴演算法時執行的情況:

使用非遞迴演算法時執行的情況:

從實驗結果可以看出,與n皇后問題不同,對於漢諾塔問題的求解,當使用遞迴的方法來解決時它的時間複雜度比非遞迴的方法要好。而且,使用遞迴演算法寫**時更容易理解。通過對於漢諾塔問題非遞迴與遞迴方法的對比可以得出結論:有的時候使用的遞迴的方法對於問題的求解不僅更能使人容易理解,而且效率更高。我們在以後編**時也應該注意遞迴方法的使用。

漢諾塔問題遞迴與非遞迴演算法

漢諾塔問題描述如下 有 a b c 3 根針,n 個圓盤 從 1.n 從上到下,按小到大順序放在 a 處,要求每次移動乙個,並保持從小到大的疊放順序,利用 c,把 n 個盤子移動到 b 處。遞迴演算法比較容易理解 fn hanoi n hanoi move n,a b c fn hanoi move...

漢諾塔非遞迴演算法

輸入格式 輸入為乙個正整數n,即起始柱上的盤數。輸出格式 每個操作 移動 佔一行,按柱1 柱2的格式輸出 輸入樣例 3輸出樣例 a c a b c b a c b a b c 乙個美國學者總結得到 所有的漢諾塔移動可以總結為重複的兩步,我們假設現在最小的圓盤在a柱子上,柱子為a,b,c 第二步 對a...

遞迴和非遞迴實現漢諾塔問題

漢諾塔 又稱河內塔 問題其實是印度的乙個古老的傳說。開天闢地的神勃拉瑪 和中國的盤古差不多的神吧 在乙個廟裡留下了三根金剛石的棒,第一根上面套著64個圓的金片,最大的乙個在底下,其餘乙個比一 個小,依次疊上去,廟裡的眾僧不倦地把它們乙個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作為幫助,但每...