習題3 10 漢諾塔的非遞迴實現

2021-08-14 13:07:13 字數 1357 閱讀 9060

題目詳情我就不描述了,很經典的問題,然後問題是,用遞迴來做是很好理解,很順理成章的問題,但是用非遞迴,對我來說感覺很彆扭,斷斷續續看了兩個都領悟,網上對於非遞迴的方法其實也說的不清不楚,也可能是我比較笨,我嘗試講一下我的理解。

看完之後,然後可以列一下漢諾塔的解法:

盤數解法

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個盤子所在...