1. 程式人生 > >python 語言基礎四

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