3 2 漢諾塔的非遞迴實現

2022-03-29 13:37:09 字數 1212 閱讀 8788

漢諾塔實現的基本思路是:不斷將n個盤的漢諾塔問題轉換為2個(n-1)個盤的漢諾塔問題,用遞迴實現比較好理解。設n盤問題為(n, a, b, c),其中引數如下結構體所定義,第乙個引數表示需要移動的盤子的數量,第二個引數表示n個盤子起始所在柱子a, 第三個引數表示會被借用的柱子b, 第四個引數表示這 n個盤子所在的目標柱子c。

假設(n, a, b, c)表示把 a柱子上的n個盤借助b柱子移動到 c 柱子上,這個問題的遞迴求解方式是

先把 a 柱子的(n-1)盤子借助c柱子移動到b柱子上(n-1, a, c, b),

然後把 a 柱子剩下的乙個盤子移動到 c 柱子上(1, a, b, c),

最後把 b 柱子上的(n-1)個盤子移動到 c 柱子上(n-1, b, a, c)

則問題求解可轉換為對(n - 1, a, c, b)、(1, a, b, c)、(n - 1, b, a, c)這三個問題的求解,其中(1, a, b, c)不需要遞迴,可直接實現,將n個盤的漢諾塔問題轉換為2個(n-1)個盤的漢諾塔問題,然後使用遞迴將(n-1)盤問題轉換成(n-2)盤問題,直到盤數為1

遞迴方式本質上使用棧來實現的,所以如果採用非遞迴的方式也是使用棧來輔助實現。

但是若是用堆疊來實現的話,當將分解出的上述三個問題壓入棧時,應該按照「需要先求解的問題後壓入」的順序,也就是壓入順序為:(n - 1, b, a, c), (1, a, b, c), (n - 1, a, c, b).

1 typedef struct

elementtype; //

漢諾塔問題的結構型別

1

//借助棧的非遞迴實現

2void hanoi(intn)3

28}29 }

下面是棧的實現和主函式:

1 #include 2

#define maxsize 100

34 typedef struct

stack; //

堆疊的標準定義89

void push(stack *ptrs, elementtype item)

1017

else

1822}23

24 elementtype pop(stack *ptrs)

2531

else

3236}37

38int

main()

39

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

漢諾塔的遞迴和非遞迴實現 借助堆疊以非遞迴 迴圈 方式求解漢諾塔的問題 n,a,b,c 即將n個盤子從起始柱 標記為 a 通過借助柱 標記為 b 移動到目標柱 標記為 c 並保證每個移動符合漢諾塔問題的要求。輸入為乙個正整數n,即起始柱上的盤數。每個操作 移動 佔一行,按柱1 柱2的格式輸出。3a ...

pta 漢諾塔的非遞迴實現

借助堆疊以非遞迴 迴圈 方式求解漢諾塔的問題 n,a,b,c 即將n個盤子從起始柱 標記為 a 通過借助柱 標記為 b 移動到目標柱 標記為 c 並保證每個移動符合漢諾塔問題的要求。輸入格式 輸入為乙個正整數n,即起始柱上的盤數。輸出格式 每個操作 移動 佔一行,按柱1 柱2的格式輸出。輸入樣例 3...

漢諾塔非遞迴演算法

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