python 語言基礎四
十、遞迴
遞迴的實現原理是在函式內部呼叫自身, 每次呼叫函式都需要做 壓棧、 彈棧、 儲存和恢復暫存器的棧操作。 所以是非常消耗時間和空間的。另外如果遞迴忘記返回(沒有設定遞迴邊界)就會完全消耗掉記憶體資源或者使程式崩潰。
遞迴的三要素: 1、明確遞迴終止條件; 【遞迴邊界】
2、給出遞迴終止時的處理辦法;
3、提取重複的邏輯,縮小問題規模。
def return_self(): print('我在呼叫自己') return return_self()
return_self() 輸出一百個 我在呼叫自己 然後丟擲異常 : RecursionError: maximum recursion depth exceeded while calling a Python object 這個異常是 python 基於對記憶體的保護自動丟擲的, 如果無限呼叫自己, 最終會將系統的記憶體消耗完, python 預設的遞迴深度為 100 層。
求階乘 :
方法一、使用迭代 def factorial(n): result = n for i in range(1, n): result *= i return result
print(factorial(4)) 24
方法二、使用遞迴 def factorial(n): if n == 1: 【遞迴邊界】 return 1 【給出遞迴終止時的處理辦法】 else: return n * factorial(n - 1) 【提取重複的邏輯,縮小問題規模】
print(factorial(4)) 24
求斐波那契數列:
迭代 :
def fbnq2(n): n1 = 1 n2 = 1 n3 = 1 if n < 1: print('輸入有誤') return -1
while n > 2: n3 = n2 + n1 n1 = n2 n2 = n3 n -= 1
return n3
print(fbnq2(7)) 13
遞迴 :
def fbnq(n): if n <= 2: return 1 else: return fbnq(n - 1) + fbnq(n - 2) 分治思想
print(fbnq(7)) 13
漢諾塔遊戲 :
遞迴 : def hanoi(n, x, y, z): if n == 1: # 將一個圓盤從 x 移動到 z print(x,' --> ', z) else: # 將上面的 n-1 個圓盤從 x 移動到 y hanoi(n-1, x, z, y) # 將底部最後一個圓盤從 x 移動到 z print(x, ' --> ', z) # 將 y 上的 n-1 個圓盤移動到 z hanoi(n-1, y, x, z)
hanoi(2, 'x', 'y', 'z') 輸出 : x --> y x --> z y --> z