漢諾塔問題

2021-09-11 10:37:08 字數 1055 閱讀 8419

漢諾塔問題是運用遞迴和學習遞迴的最典型題目

問題:有一塊板子上有三個釘子,a,b,c。a針上套有64個大小不等的圓盤,大的在下,小的在上。現在要把所有的圓盤從a針移動到c針,而且每次只能移動乙個圓盤,移動可以借助b針進行,現在求移動的步驟。

思考:1. 最大的圓盤只要保證在c針的最下邊,該盤就不用考慮如何擺放了。

2. 假設有乙個圓盤,可以直接將該圓盤放到c上。

3. 假設有兩個圓盤:我們可以借助b指標放n-1=1個圓盤,然後將最大的圓盤放到c上, 然後 執行思考2中的步驟;

4. 假設有3個圓盤,可以考慮把上邊的兩個圓盤按照思考3的方式將上邊的兩個圓盤分別放在b,c上,現在的a可以看作是空,因為最大在下邊,借組a將第二大的圓盤放在b上,然後將最大的放在c上,此時b有兩個盤子,c有乙個最大的。(以後也不用考慮了)相當於回歸到了兩個盤子的問題,就到了思考3.這樣一層一層的你會發現問題又回歸到了最初的放乙個盤子,典型的一道遞迴問題;

有n個盤子,第一步:我們可以借助c針將n-1個盤子放到b上;最大的放到c針下。

第二步:我們可以借助a針將n-2個盤子放到a上,倒數第二大的盤子放到了c下;

第三步:借助b針將n-3大個盤子放到b上,依次類推,直到剩下乙個盤子為止;

#include

#include

void

shift

(char

,char

,char

,int);

intmain

(int argc,

char

*ar**)

void

shift

(char p1,

char p2,

char p3,

int n)

else

}

執行結果:

對於遞迴的學習:一定多嘗試手寫幾次,寫的多了規律潛移默化的就出來了。

漢諾塔問題

問題 假設有3個分別命名為x,y,z的寶塔,在塔座x上插有n個直徑大小各不相同,從小到大編號為1,2,3。n的圓盤。現要求將x軸上的n個圓盤移至塔座z上 並仍然按同樣的順序疊排,圓盤移動時必須遵循下列規則 1.每次只能移動乙個圓盤 2.圓盤可以插在x,y和z中的任一塔座上 3.任何時刻都不能將乙個較...

漢諾塔問題

問題是 印度的乙個古老的傳說。開天闢地的神勃拉瑪在乙個廟裡留下了三根金剛石的棒,第一根上面套著64個圓的金片,最大的乙個在底下,其餘乙個比乙個小,依次疊上去,廟裡的眾僧不倦地把它們乙個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作為幫助,但每次只能搬乙個,而且大的不能放在小的上面。解答結果請自...

漢諾塔問題

漢諾塔如下圖所示 需要我們完成的事情是把盤子移動到c,規則就不贅述了。演算法思想 總體來說是利用遞迴完成的。假設 1 a上只有乙個盤子,我們直接移動到c即可 2 a上有兩個盤子,我們把第二個盤子上面的所有盤子 此時只有乙個,比較容易 移動到b,再把第二個盤子移動到目的地c,最後把b上的盤子移動到c ...