漢諾塔的遞迴和非遞迴實現

2022-03-06 04:14:35 字數 1617 閱讀 7197

漢諾塔的遞迴和非遞迴實現 

借助堆疊以非遞迴(迴圈)方式求解漢諾塔的問題(n, a, b, c),即將n個盤子從起始柱(標記為「a」)通過借助柱(標記為「b」)移動到目標柱(標記為「c」),並保證每個移動符合漢諾塔問題的要求。

輸入為乙個正整數n,即起始柱上的盤數。

每個操作(移動)佔一行,按柱1 -> 柱2的格式輸出。

3
a -> c

a -> b

c -> b

a -> c

b -> a

b -> c

a -> c

**:(遞迴演算法)

ps:函式hanoi裡的n是n個盤子,move函式裡的n是第n個

1 #include 2

int i=1;//

記錄步數

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

將編號為n的盤子由from移動到to47

void hanoi(int n,char x,char y,char z)//

將n個盤子由初始塔移動到目標塔(利用借用塔)818

}19intmain()

20

遞迴的演算法,簡潔一點也可以這樣寫:

void hanoi(int n,char a,char b,char c)  //

a借助b,將n個盤子移到c ,遞迴的妙用在於不用關心具體實現的細節

}

坦白說,關於非遞迴的演算法,沒什麼思路,就是用遞迴演算法跑一些數值,想出來的演算法也不是特別好

**:(非遞迴演算法)

1 #include2 #include3 #include 4 #include 5 #include6

using

namespace

std;

7int temp1=-1, temp2=-1

; 8

char s[4] = ;//

為了解題簡便,我是從1開始算的

9 stack a[4

];

10int c1 = 0

; 11

int rank1[4

];

12bool compare(int a1,int

b1)

13

20bool move1(int before,int after)

30int

main()

43else

47for (i = 1; i <= 3; i++)//

初始化棧排序表

48 rank1[i] =i;

49int

tt;

50while (c1 < pow(2, n) -1

)

58else

59 move1(rank1[2], rank1[1

]);

60 tt = rank1[2

];

61}

62 }

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

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

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

漢諾塔問題 古代有乙個梵塔,塔內有3個基座,a基座上有64個盤子,盤子大小不等,大的在下,小的在上。有乙個老和尚想把盤子由a座移到b座,但每次只能移動乙個盤子,3個基座上的盤子都始終保持大的在下,小的在上。移動過程中可以利用c基座做輔助,求解其移動過程。漢諾塔問題是遞迴演算法比較經典的例題,幾乎是每...

漢諾塔遞迴方法和非遞迴方法

三個盤子為a,b,c,其中c是中介盤,我們要遵守移動規則將a上的盤子要全部通過b移動到c。include includeusing namespace std define maxsize 50 typedef struct elemtype 順序棧中元素型別 typedef struct stac...