1. 程式人生 > 其它 >Python之漢諾塔

Python之漢諾塔

技術標籤:Pythonpython

文章目錄


前言

我印象中我的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上
問題二也是這樣的思路


總結

遞迴,就是方法自己調自己,遞迴有兩個條件:呼叫函式自身;設定了正確的返回條件


條件一,可以說是遞迴的核心;條件二,是遞迴的結束判斷,一旦沒有返回條件,遞迴就會陷入死迴圈