漢諾塔問題

'''
漢諾塔問題無論在任何編程語言裏都是經典問題,是採用遞歸算法的經典案例,該問題能夠抽象以下:

一 3根圓柱A,B,C,其中A上面串了n個圓盤

二 這些圓盤從上到下是按從小到大順序排列的,**大的圓盤任什麼時候刻不得位於小的圓盤上面**

三 **每次移動一個圓盤**,最終實現將全部圓盤移動到C上


利用Python語言接近天然語言的特性,開發者能夠更容易的將遞歸算法翻譯成程序語句,須要的代碼量很小。漢諾塔問題的解決步驟用語言描述很簡單,僅三步:

A,B,C三個圓柱,分別爲初始位,過渡位,目標位,設A柱爲初始位,C位爲最終目標位

(1)將最上面的n-1個圓盤從初始位移動到過渡位

(2)將初始位的最底下的一個圓盤移動到目標位

(3)將過渡位的n-1個圓盤移動到目標位

對於遞歸算法中的嵌套函數f(n-1)來講,其初始位,過渡位,目標位發生了變化
'''


def move(n, a, b, c):  # n爲圓盤數,a表明初始位圓柱,b表明過渡位圓柱,c表明目標位圓柱
    if n == 1:
        print(a, '-->', c)
    else:
        move(n - 1, a, c, b)  # 將初始位的n-1個圓盤移動到過渡位,此時初始位爲a,上一級函數的過渡位b即爲本級的目標位,上級的目標位c爲本級的過渡位
        print(a, '-->', c)
        move(n - 1, b, a, c)  # 將過渡位的n-1個圓盤移動到目標位,此時初始位爲b,上一級函數的目標位c即爲本級的目標位,上級的初始位a爲本級的過渡位


move(2, 'A', 'B', 'C')

'''
A --> B
A --> C
B --> C
'''

# n層當作兩層,1個爲1層,餘下的n-1層排序好了
# n-1層當作2層,1個爲1層,餘下的n-2層排序好了

# 5層當作2層,1個爲1層,餘下的4層排序好了
# 4層當作2層,1個爲1層,餘下的3層排序好了
# 3層當作2層,1個爲1層,餘下的2層排序好了
# 2層當作1層,1個爲1層,餘下的1層排序好了
# 1層 A-->C
相關文章
相關標籤/搜索