漢諾塔 經典遞迴問題

2022-05-11 17:12:19 字數 1091 閱讀 1466

漢諾塔問題是乙個經典的遞迴問題,大意是:有a, b, c三根柱子,a柱上有n個盤子,小的在上,大的在下,現在要在b柱的幫助下將a柱上的所有盤子移動到c柱上,而且要求每次只能移動乙個,並且任何時候小的盤子只能在大的盤子上面。

利用遞迴逐步分解問題的思想可以輕鬆解決這道題。首先考慮只有乙個圓盤(n=0)的情況,之間從a移動到c即可;對於n個圓盤的情況,可以分解為3步:首先把上層 n-1 個圓盤移到b柱,然後把a柱上的1個圓盤移到c柱,最後把b柱上的 n-1 個圓盤移到c柱

,完成移動。所以問題就變成了 n-1 個柱子移動的問題,以此類推,直到回到最初的移動乙個圓盤的時候。python實現的**如下:

def move(n, a, b, c):   

if n == 1:

print(a, ' --> ', c)

return

move(n-1, a, c, b)

move(1, a, b, c)

move(n-1, b, a, c)

return

#結果如下:

>>> move(3, 'a', 'b', 'c')

a --> c

a --> b

c --> b

a --> c

b --> a

b --> c

a --> c

根據上述分析,第n個盤子需要把其上n-1個移走,然後底座1個移去目的地,最後把n-1個移過來,可以得出移n個盤子的所需的次數 f(n )= f(n-1)* 2 + 1,解出來後 f(n)= 2^n - 1。古老傳說中大梵天讓婆羅門移動上有64片**圓盤的漢諾塔,計算一下,需要移動 2^64 - 1 次,就算一次一秒,完成也需要約5846億年,可怕!

總結:我們可以看到,在解決這個問題的時候,如果糾結於每乙個圓盤的移動,就會很複雜,但如果能夠站在高處,不拘於細節而是把整個過程分解為幾個大的部分,就能逐漸轉化為更簡單的問題。在思考遞迴的時候,可以將其當作乙個黑盒來看待,而不必進入遞迴內部,否則容易越陷越深。

經典遞迴問題 漢諾塔

漢諾塔 漢諾塔問題第一次接觸時就感覺非常有趣,但是由於當時知識有限不能深刻地理解遞迴的含義,所以沒能繼續深究,現在來談一談吧。題目描述 漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從上往下從小到大順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在...

經典問題 漢諾塔(遞迴)

c 如下 法國數學家愛德華 盧卡斯曾編寫過乙個印度的古老傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片 一次只...

經典遞迴 漢諾塔問題

有三個柱子,三個盤子都在第乙個柱子上,現在要移到第三個柱子上,要求移動過程中盤子相對位置不變,小的還是在上,大的在下。思路 分兩步 1.將n 1個盤從乙個柱子移到另乙個柱子 借助另外乙個柱子 n 1 2.將1個盤子從乙個柱子移到另乙個柱子 用3個柱子移動n 1個盤子,目的 把所有盤子從x移到z vo...