題目詳情我就不描述了,很經典的問題,然後問題是,用遞迴來做是很好理解,很順理成章的問題,但是用非遞迴,對我來說感覺很彆扭,斷斷續續看了兩個都領悟,網上對於非遞迴的方法其實也說的不清不楚,也可能是我比較笨,我嘗試講一下我的理解。
看完之後,然後可以列一下漢諾塔的解法:
盤數解法
1a->c
2a->b
a->c
b->c
3a->c
a->b
c->b
a->c
b->a
b->c
a->c4略
其實2個盤的情況就是解題的關鍵了。全部步驟總結起來就三步:
1、將0到n-1盤從a移到b;
2、將第n盤從a移到c;
3、最後把0到n-1盤從b移到c;
在程式中就是,慢慢將n-1分解,直到1。
那麼用非遞迴方法利用就是堆疊先進後出的特性,解決問題時,堆疊內情況如下:
取盤數為3,進行模擬堆疊操作
迴圈的思路就是,當棧不空時,將棧頂丟擲,然後判斷棧頂是否為1,不是就繼續分解,是則輸出;
#include #include #include #define stacksize 100
typedef struct
elementtype;
typedef int position;
typedef struct snode* ptrtosnode;
struct snode
;typedef ptrtosnode mystack;
elementtype error;
mystack create(int maxsize);
bool isempty(mystack ms);
bool pushdata(mystack ms, elementtype x);
elementtype popdata(mystack ms);
void hanoi(int pan);
void hanoi(int pan)
else
}}mystack create(int maxsize)
bool isempty(mystack ms)
bool isfull(mystack ms)
bool pushdata(mystack ms, elementtype x)
else
}elementtype popdata(mystack ms)
else
}int main()
漢諾塔的遞迴和非遞迴實現
漢諾塔的遞迴和非遞迴實現 借助堆疊以非遞迴 迴圈 方式求解漢諾塔的問題 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...
3 2 漢諾塔的非遞迴實現
漢諾塔實現的基本思路是 不斷將n個盤的漢諾塔問題轉換為2個 n 1 個盤的漢諾塔問題,用遞迴實現比較好理解。設n盤問題為 n,a,b,c 其中引數如下結構體所定義,第乙個引數表示需要移動的盤子的數量,第二個引數表示n個盤子起始所在柱子a,第三個引數表示會被借用的柱子b,第四個引數表示這 n個盤子所在...