Python之漢諾塔
阿新 • • 發佈:2021-01-20
文章目錄
前言
我印象中我的JAVA教學中教遞迴使用了兩個例子,一個是前面說過的斐波那契數列,而另一個也是很有名氣的漢諾塔問題,現在Python也用這兩個問題來演示遞迴
一、漢諾塔是什麼?
漢諾塔是在一塊銅板裝置上,有三根杆(編號A、B、C),在A杆自下而上、由大到小按順序放置一定數量的金盤,把A杆上的金盤全部移到C杆上,並仍保持原有順序疊好。操作規則:每次只能移動一個盤子,並且在移動過程中三根杆上都始終保持大盤在下,小盤在上,操作過程中盤子可以置於A、B、C任一杆上
二、程式碼演示
1.遞迴
def hanoi(n, x, y, z):
if n == 1:
print(x, '-->', z)
else:
hanoi(n - 1, x, z, y)
print(x, '-->', z)
hanoi(n - 1, y, x, z)
if __name__ == '__main__':
n = int(input("請輸入漢諾塔的層數:"))
hanoi(n, "X", "Y", "Z" )
程式碼其實很簡單,只是這個邏輯不太好理解,以下僅是個人理解(假設有64個盤子):
(1)將前63個盤子從A移動到B上,確保大盤在小盤下面;
(2)將最底下的第64個盤子從A上移動到C上;
(3)將B上的63個盤子移動到C上
由此就會有兩個新的問題:
問題一:將A上的63個盤子藉助C移動到B上
問題二:將B上的63個盤子藉助A移動到C上
這樣的話,這兩個問題又可以拆解為:
問題一:(1)將前62個盤子從A移動到C上,確保大盤在小盤下;(2)將最底下的第63個盤子移動到B上,將C上的62個盤子移動到B上
問題二也是這樣的思路
總結
遞迴,就是方法自己調自己,遞迴有兩個條件:呼叫函式自身;設定了正確的返回條件 。
條件一,可以說是遞迴的核心;條件二,是遞迴的結束判斷,一旦沒有返回條件,遞迴就會陷入死迴圈