問題描述:古代有一個梵塔,塔內有三個座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
下面是運行結果