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

2021-09-30 10:24:32 字數 1926 閱讀 8224

漢諾塔

(又稱河內塔)問題其實是印度的乙個古老的傳說。

開天闢地的神勃拉瑪(和中國的盤古差不多的神吧)在乙個廟裡留下了三根金剛石的棒,第一根上面套著64個圓的金片,最大的乙個在底下,其餘乙個比一 個小,依次疊上去,廟裡的眾僧不倦地把它們乙個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作為幫助,但每次只能搬乙個,而且大的不能放在小的上 面。計算結果非常恐怖(移動圓片的次數)18446744073709551615,眾僧們即便是耗盡畢生精力也不可能完成金片的移動了。

演算法介紹:

其實演算法非常簡單,當盤子的個數為n時,移動的次數應等於2^n – 1(有興趣的可以自己證明試試看)。後來一位美國學者發現一種出人意料的簡單方法,只要輪流進行兩步操作就可以了。首先把三根柱子按順序排成品字型,把所 有的圓盤按從大到小的順序放在柱子a上,根據圓盤的數量確定柱子的排放順序:若n為偶數,按順時針方向依次擺放 a b c;

若n為奇數,按順時針方向依次擺放 a c b。

(1)按順時針方向把圓盤1從現在的柱子移動到下一根柱子,即當n為偶數時,若圓盤1在柱子a,則把它移動到b;若圓盤1在柱子b,則把它移動到c;若圓盤1在柱子c,則把它移動到a。

(2)接著,把另外兩根柱子上可以移動的圓盤移動到新的柱子上。即把非空柱子上的圓盤移動到空柱子上,當兩根柱子都非空時,移動較小的圓盤。這一步沒有明確規定移動哪個圓盤,你可能以為會有多種可能性,其實不然,可實施的行動是唯一的。

(3)反覆進行(1)(2)操作,最後就能按規定完成漢諾塔的移動。

所以結果非常簡單,就是按照移動規則向乙個方向移動金片:

如3階漢諾塔的移動:a→c,a→b,c→b,a→c,b→a,b→c,a→c

漢諾塔問題也是程式設計中的經典遞迴問題,下面我們將給出遞迴和非遞迴的不同實現源**。

一、遞迴方法實現

#includeusing namespace std;

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

二、非遞迴方法

思想: 一位美國學者發現一種出人意料的簡單方法,只要輪流進行兩步操作就可以了。首先把三根柱子按順序排成品字型,把所有的圓盤按從大到小的順序放在柱子a上,根據圓盤的數量確定柱子的排放順序:若n為偶數,按順時針方向依次擺放 a b c;

若n為奇數,按順時針方向依次擺放 a c b。

(1)按順時針方向把圓盤1從現在的柱子移動到下一根柱子,即當n為偶數時,若圓盤1在柱子a,則把它移動到b;若圓盤1在柱子b,則把它移動到c;若圓盤1在柱子c,則把它移動到a。

(2)接著,把另外兩根柱子上可以移動的圓盤移動到新的柱子上。即把非空柱子上的圓盤移動到空柱子上,當兩根柱子都非空時,移動較小的圓盤。這一步沒有明確規定移動哪個圓盤,你可能以為會有多種可能性,其實不然,可實施的行動是唯一的。

(3)反覆進行(1)(2)操作,最後就能按規定完成漢諾塔的移動。

所以結果非常簡單,就是按照移動規則向乙個方向移動金片:

如3階漢諾塔的移動:a→c,a→b,c→b,a→c,b→a,b→c,a→c

#include using namespace std; 

//圓盤的個數最多為64

const int max = 64;

//用來表示每根柱子的資訊

struct st

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

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

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

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

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