Python演算法 遞迴精解 漢諾塔問題

2022-06-27 23:00:20 字數 1590 閱讀 2396

將a 柱子上的塊轉移到 c 上

條件1  -  每次只能轉移一塊

條件2  -  大塊不能壓小快

冰箱裝大象問題: 

1. 開啟冰箱

2. 放入大象

3. 關上冰箱 

模擬在 任何乙個塊 n 來說: 

1. 把上面的塊都移動好

2. n 塊移動過去

3. 之前上面的塊在放在 n 塊上面

簡化問題, 考慮 123塊的移動, 可以考慮成我想移動 3 . 必然要移動12

同理 我想移動 2, 必然要移動 1, 即關係為

f(3) ---> f(2) ---> f(1)    問題分解為 3, 2, 1 塊的獨立流程, 即反向推引

f(3)  ==>  f(1) + (2)     3 塊的前提是 2,1 的問題處理

f(2)  ==>  f(1)    2 塊的前提是 1 的問題處理

用人來比喻的話, 每個塊都有個工人負責

工人n 有三個能力

1. 只能移動 第 n 塊到任何柱子

2. 工人 n 可以叫人幫他處理壓在他上面的塊  (讓 工人n-1 處理)

3. 工人 n 最後的工作是搬動 第n 塊到目標柱子上

搬動的時候要確定的是你要從哪個柱子搬到哪個柱子。

題目中有三個柱子。 第乙個起始柱子, 第三個目標柱子, 那剩下乙個就是轉移柱

轉移柱子可以作為中轉站, 最終目標是到三柱。

在步驟三之前。 只能將上面的塊都放在中轉的二柱上

def

hnt(index, start, mid, end):

#最後的人只有乙個工作就是把第乙個塊移動到終點

if index == 1:

print

"{}--->{}

".format(start, end)

else

:

#叫人來把上面的塊搬走, 先放在 mid 上做中轉

hnt(index - 1, start, end, mid)

#自己把自己的塊搬到目標柱

print

"{}--->{}

".format(start, end)

#叫人把之前的塊搬回來, 之前在 mid 上, 現在要放在 end 上, 用 start 中轉

hnt(index - 1, mid, start, end)

if__name__ == '

__main__':

hnt(3, "

a", "

b", "c"

)

#a--->c

#a--->b

#c--->b

#a--->c

#b--->a

#b--->c

#a--->c

遞迴解漢諾塔

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

漢諾塔 遞迴演算法

個人覺得漢諾塔這個遞迴演算法比電子老鼠的難了一些,不過一旦理解了也還是可以的,其實網上也有很多 可以直接參考。記得大一開始時就做過漢諾塔的習題,但是那時 寫得很長很長,也是不理解遞迴的結果。現在想起來漢諾塔的演算法就3個步驟 第一,把a上的n 1個盤通過c移動到b。第二,把a上的最下面的盤移到c。第...

漢諾塔遞迴演算法

大學的時候專業課程很差,指導大二學習演算法設計的時候,發現專業課裡比較有趣的一門。專心學習了一學期 最近在學習python發現了乙個遞迴演算法很迷茫,遂研究了一下。簡單來說明一下 首先漢諾塔的規則是1 每次移動一塊 2 小木塊只能放在大木塊上 3 將所有木塊從a柱子移動c柱子木塊上 用幾個變數和常量...