漢諾塔問題 遞迴

2021-10-01 10:10:09 字數 1241 閱讀 7243

漢諾塔問題是乙個經典的問題。漢諾塔(hanoi tower),又稱河內塔,源於印度乙個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片**圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動乙個圓盤。問應該如何操作?

關於遞迴: 一定不要試圖跟蹤大型遞迴的過程! 要寫出遞迴,關鍵就是找出遞迴的遞迴方程式:

也就是說,要完成最後一步,那麼最後一步的前一步要做什麼。

遞迴的關鍵有兩個:

(1)遞迴的結束條件(不寫會死迴圈)

(2)遞迴最後一層和其他有關係的層的關係怎樣用非遞迴函式來表達

比如:斐波納契亞數列,(1)當n1和n2的時候f(n)=1,這就是遞迴的終止條件。給了終止條件,計算機才能進行求解子問題並回溯,最終求出f(n)

解決這個問題整體分為3大步驟:

1:將在a上的63個盤子通過c移動到b上

2:將在a上編號為64的盤子移動到c上

3:將b上的63個盤子移動到c上

//可以配合**去理解這個過程

// 列印移動方式:編號,從哪個盤子移動到哪個盤子

void

hanoi

(int n,

char a,

char b,

char c)

// 把a上的n個盤子通過b移動到c

}int

main()

輸入:

2
輸出:
set 1

: move 1 from a-

>b

set 2

: move 2 from a-

>c

set 3

: move 1 from b-

>c

漢諾塔問題(遞迴)

題目描述 對於傳統的漢諾塔遊戲我們做乙個拓展,我們有從大到小放置的n個圓盤,開始時所有圓盤都放在左邊的柱子上,按照漢諾塔遊戲的要求我們要把所有的圓盤都移到右邊的柱子上,請實現乙個函式列印最優移動軌跡。給定乙個int n,表示有n個圓盤。請返回乙個string陣列,其中的元素依次為每次移動的描述。描述...

漢諾塔問題(遞迴)

問題 漢諾塔問題 解法 遞迴求解 思路 先把n 1從a移動b 在把第n個從a移到c 使用遞迴使得 變得簡單 複雜度 2的n次方 1 includeint step 1 void hanoi int level,char a,char b,char c 1 當盤子數大於1時,先把n 1個從a借助c移動...

漢諾塔問題(遞迴)

漢諾塔 在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,有三根柱子。印度教的主神梵天在創造世界的時候,在其中一根柱子上從下到上地穿好了由大到小的64片金盤,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金盤 一次只移動一片,不管在哪根柱子上,小片必須在...