演算法-漢諾塔-python3實現
阿新 • • 發佈:2018-12-11
0.摘要
本文使用python3實現漢諾塔問題。
1.問題闡述與分析
有三個柱子A,B,C,每個柱子上都可以放置圓盤。最初,所有圓盤都在A柱子上,需要把所有圓盤都移動到C柱子上。
要求:
1.每次只移動一個圓盤
2.只能移動柱子最上面的圓盤
3.保證每根柱子上,上面的圓盤一定比下面的圓盤小
經過分析,我們發現,這樣的問題可以分解為下面三個子步驟
step1:如果想把A柱子上的圓盤都移動到C柱子上,那麼必須先想辦法把A柱子上n-1個圓盤移動到B柱子上。
不難看出,“把A柱子上圓盤移動到B柱子上”和“把A柱子上的圓盤都移動到C柱子上”,這是同一類問題。區別只不過圓盤數量變為了n-1,source是A柱子,target是B柱子。
step2:這時候可以把最大的圓盤移動到C柱子上。並且由於這個圓盤是最大的,所以其他任意圓盤都可以放在C柱子上。這時候的C柱子,和空柱子具有相同的作用。
step3:這時候,我們發現,問題轉換成了如何把B柱子上n-1個圓盤移動到C柱子上?
不難看出,“把B柱子上圓盤移動到C柱子上”和“把A柱子上的圓盤都移動到C柱子上”,又是同一類問題。區別只不過圓盤數量變為了n-1,source是B柱子,target是C柱子。
2.程式碼實現
通過上面的分析,我們發現:
當需要移動的圓盤數量n=1時,直接移動圓盤即可;
當需要移動的圓盤數量n>1時,這個問題都可以轉化成n-1個圓盤的問題。
#coding=utf-8
def hanoi(n,a,b,c):
if n == 1:
print(a , ' --> ',c)
else:
hanoi(n-1,a,c,b)
hanoi(1,a,b,c)
hanoi(n-1,b,a,c)
if __name__ == '__main__':
hanoi(3,'A','B','C')