1. 程式人生 > >演算法-漢諾塔-python3實現

演算法-漢諾塔-python3實現

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')