深究Python中的遞歸【建議收藏】

前言:本博文主要講解Python中的遞歸,以前在C#中也講過遞歸的一些知識——深刻理解C#方法重載和遞歸,有興趣的朋友能夠閱讀一下!
python

1、遞歸的應用場景

遞歸是一種編程思想,應用場景:web

  1. 在咱們平常開發中,若是要遍歷一個文件夾下面全部的文件,一般會使用遞歸來實現。
  2. 在後續的算法課程中,不少算法都離不開遞歸,例如:快速排序。

遞歸的特色:算法

  • 函數內部本身調用本身。
  • 必須有出口。

遞歸算法:遞歸(Recursion),在數學與計算機科學中,是指在函數的定義中使用函數自身的方法。編程

2、生活中的遞歸

1. 故事案例

  1. 咱們使用的詞典,自己就是遞歸,爲了解釋一個詞,須要使用更多的詞。當你查一個詞,發現這個詞的解釋中某個詞仍然不懂,因而你開始查這第二個詞,惋惜,第二個詞裏仍然有不懂的詞,因而查第三個詞,這樣查下去,直到有一個詞的解釋是你徹底能看懂的,那麼遞歸走到了盡頭,而後你開始後退,逐個明白以前查過的每個詞,最終,你明白了最開始那個詞的意思。
  2. 多年前我五歲的兒子問我「不是每條船都有救生艇的吧?」「怎麼會呢?」「也許救生艇上會有一艘更小的救生艇,可是那艘小艇上可能就沒有更小的救生艇了。」
  3. 一個洋蔥是一個帶着一層洋蔥皮的洋蔥。

2. 圖片案例

在這裏插入圖片描述

3、遞歸的應用案例

1. 應用:3之內數字累加和

  • 代碼
# 3 + 2 + 1
def sum_numbers(num):
    # 1.若是是1,直接返回1 -- 出口
    if num == 1:
        return 1
    # 2.若是不是1,重複執行累加並返回結果
    return num + sum_numbers(num-1)


sum_result = sum_numbers(3)
# 輸出結果爲6
print(sum_result)
  • 執行結果
    在這裏插入圖片描述

2. 應用:n之內數字階乘

# 階乘函數
def Fact(n):
    if n == 1:
        return 1
    return n * Fact(n-1)

3. 應用:斐波拉契數列

def Fibo(n):
    # 出口
    if n == 1 or n == 2:
        return 1
    else:
        return Fibo(n - 1) + Fibo(n - 2)

4、遞歸的特色

  1. 必須有一個明確的結束條件。
  2. 每次進入更深一層遞歸時,問題規模(計算量)相比上次遞歸都應有所減小。
  3. 遞歸效率不高,遞歸層次過多會致使棧溢出(在計算機中,函數調用是經過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。因爲棧的大小不是無限的,因此,遞歸調用的次數過多,會致使棧溢出),此時程序會拋出錯誤:超出最大遞歸深度。
  1. 遞推:像上邊遞歸實現所拆解,遞歸每一次都是基於上一次進行下一次的執行,這叫遞推。
  2. 回溯:則是在遇到終止條件,則從最後往回返一級一級的把值返回來,這叫回溯。

補充:本博文關於遞歸的故事案例、圖片案例均引用自知乎,感謝讀者閱讀!數據結構