Python實現漢諾塔

轉自廖雪峯網站神評論,解析十分清楚。

源碼:https://github.com/michaelliao/learn-python3/blob/master/samples/function/recur.py

move(n, a, b, c)這個函數不要理解爲ABC三個柱子。
請這樣理解,move函數,用來完成這麼一個任務:

把n個盤子,從“源柱”通過“過渡柱”移動到“目標柱”上。
即move(n, source, bridge, destination)

爲了完成這個任務,需要將此母任務分解爲三個子任務:
1.把“源柱”上面的n-1個盤,移動到“過渡柱”
2.把“源柱”最下面的第n個盤移動到“目標柱”
3.把第一步中的n-1個盤從“過渡柱”移動到“目標柱”,任務完成。


第一步中“移動n-1個盤”子任務和“移動n個盤”母任務僅僅是目的柱的位置不一樣。
子任務中源盤和母任務一樣,過渡盤是母任務的目的盤,目的盤是母任務的過渡盤。所以調用函數應該是這樣

# 把n-1個盤,從source通過destination移動到bridge
move(n-1, source, destination, bridge)

同理,第三步的函數應該是

# 把n-1個盤,從bridge通過source移動到destination
move(n-1, bridge, source,destination)

於是,三個步驟轉換成程序就是

move(n-1, source, destination, bridge)
print (source,'-->', destination)
move(n-1, bridge, source, destination)

當只有一個盤的時候,直接移動,不存在子任務

if n == 1:
    print (source,'-->', destination)

最開始,源柱,過渡柱和目的柱,分別叫做A,B,和C。
所以move調用入口應該是:move(n, ‘A’, ‘B’, ‘C’)

這下好明白了吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章