python遞歸實現漢諾塔實現

問題描述:古代有一個梵塔,塔內有三個座A、B、C,A座上有n個盤子,盤子大小不等,大的在下,小的在上(如圖)。有一個和尚想把這n個盤子從A座移到B座。

要求:

但每次只能允許移動一個盤子

並且在移動過程中,3個座上的盤子始終保持大盤在下,小盤在上。

如果只有一個盤子,則不需要利用B座,直接將盤子從A移動到C,在移動過程中可以利用B座



要求打印移動的步驟。



因爲剛學了python中的遞歸函數,這個題就是練習題,所以實現的方法很明顯,要用到遞歸。


既然要用到遞歸,就必然要有一個遞歸的終止條件,比如:在階乘函數fact(n)的遞歸中,終止條件爲n=1。那麼在漢諾塔中,遞歸的終止條件是什麼?


經過手動畫圖,進行三個盤子的漢諾塔演示時,不難發現,當A座上只有一個盤子時,下一步的操作最爲明顯,不需要再有遞歸出現,即將這最後一個盤子,移動到C座上。所以,不難猜測,漢諾塔問題的遞歸終止條件即是A座上只有一個盤子。


那麼是否可以對遞歸的終止條件,做如下猜測,即不再需要調用遞歸函數本身時即是遞歸的終止條件。(歡迎指正)



那麼我們可以編寫函數代碼如下:


# -*- coding: utf-8 -*-

def move(n, a, b, c):
    if n == 1:
        print('move', a, '->', c)
    else:
        move(n-1, a, c, b)
        move(1, a, b, c)
        move(n-1, b, a, c)


代碼執行步驟如下

(套用一下python的格式)

當n=3:

#if條件不滿足,執行else的語句,先執行第一句:

move(2,a,c,b)

當n=2:

move(1,a,c,b) 即  a—>b   

move(1,a,b,c) 即  a—>c

move(1,b,a,c) 即  b—>c

#執行move(1,a,b,c)

move(1,a,b,c) 即 a —> c

#執行else的第三句

move(2,b,a,c)

當n=2:

move(1,b,c,a) 即  b—>a   

move(1,b,a,c) 即  b—>c

move(1,a,b,c) 即  a—>c


下面是運行結果



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