『無為則無心』Python函式 — 32、遞迴

繁華似錦Fighting發表於2022-01-06

1、什麼叫遞迴函式

Python中,在函式內部,可以呼叫其他函式。如果一個函式在內部呼叫自身本身,這個函式就是遞迴函式。

2、遞迴的應用場景

遞迴是一種程式設計思想,應用場景:

  1. 在我們日常開發中,如果要遍歷一個資料夾下面所有的檔案,通常會使用遞迴來實現;
  2. 在後續的演算法課程中,很多演算法都離不開遞迴,例如:快速排序。

3、遞迴的特點

  • 1、遞迴函式必須有一個明確的結束條件。
  • 2、每進入更深一層的遞迴時,問題規模現對於上一層遞迴都會減少。
  • 3、相鄰兩次重複之間有緊密的聯絡,前一次要為後一次做準備(通常前一次的輸入就是作為後一次的輸入)
  • 4、遞迴效率不高,遞迴層次過多會導致棧溢位。

總結編寫遞迴函式最要注意的兩點:

  • 函式內部自己呼叫自己。
  • 必須有出口。

4、應用:3以內數字累加和

實現程式碼如下:

"""
# 需求分析:3以內數字累加和 3 + 2 + 1 = 6
# 6 = 3 + 2以內數字累加和
# 2以內數字累加和 = 2 + 1以內數字累加和
# 1以內數字累加和 = 1  # 出口
"""

def sum_numbers(num):
    # 1.如果是1,直接返回1 -- 出口
    # 如果沒有出口,報錯:超出最大遞迴深度
    # RecursionError: maximum recursion depth exceeded
    if num == 1:
        return 1
    # 2.如果不是1,重複執行累加並返回結果
    # 前數字 + 當前數字-1的累加和
    return num + sum_numbers(num-1)


sum_result = sum_numbers(3)
# 輸出結果為6
print(sum_result)

遞迴函式執行流程圖:

image

5、應用:階乘

def factorial(n):
    '''
        該函式用來求任意數的階乘

        引數:
            n 要求階乘的數字
    '''
    # 基線條件 判斷n是否為1,如果為1則此時不能再繼續遞迴
    if n == 1 :
        # 1的階乘就是1,直接返回1
        return 1

    # 遞迴條件
    return n * factorial(n-1)

print(factorial(10))

6、總結

  • 遞迴效率不高,遞迴層次過多會導致棧溢位(在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位)
  • 理論上,所有的遞迴函式都可以寫成迴圈的方式,但迴圈的邏輯不如遞迴清晰。
  • 遞迴編寫起來比較難,但優點是定義簡單,邏輯清晰。

相關文章