Python 遞迴函式

2021-08-24 17:40:27 字數 1970 閱讀 1546

遞迴函式就是函式在內部呼叫自身。

必須有乙個明確的遞迴結束條件,稱為遞迴出口。

注意:切勿忘記遞迴出口,避免函式無限呼叫。

函式呼叫自身的實現:

其實函式每次被呼叫時都會建立乙個新命名空間,也就是當函式呼叫「自身」時,實際上執行的是兩個不同的函式(也可以說乙個函式具有兩個不同的命名空間)。

【例】定義階乘函式

>>> def fact(n):

... if n == 1:

... return 1

... else:

... return n * fact( n-1 )

...>>>

>>> fact(1)

1>>> fact(2)

2>>> fact(4)

24>>> fact(5)

120

fact(5) 計算過程:

factorial(5)                        # 第 1 次呼叫使用 5

5 * factorial(4) # 第 2 次呼叫使用 4

5 * (4 * factorial(3)) # 第 3 次呼叫使用 3

5 * (4 * (3 * factorial(2))) # 第 4 次呼叫使用 2

5 * (4 * (3 * (2 * factorial(1)))) # 第 5 次呼叫使用 1

5 * (4 * (3 * (2 * 1))) # 從第 5 次呼叫返回

5 * (4 * (3 * 2)) # 從第 4 次呼叫返回

5 * (4 * 6) # 從第 3次呼叫返回

5 * 24 # 從第 2 次呼叫返回

120 # 從第 1 次呼叫返回

>>> def fact(n):

... result = 1

... for i in range(2,n+1):

... result *= i

... return result

...>>>

>>> fact(1)

1>>> fact(2)

2>>> fact(5)

120

優點:

缺點:

使用遞迴函式需要注意防止棧溢位。在計算機中函式呼叫是通過棧這種資料結構實現的。每當進入乙個函式呼叫,棧就會加一層棧幀;每當函式返回就會減一層棧幀。由於棧的大小不是無限的,因此遞迴呼叫次數過多會導致棧溢位。

解決遞迴呼叫棧溢位的方法是通過尾遞迴優化。

尾遞迴是指函式返回時呼叫函式本身,並且 return 語句不能包含表示式。這樣,編譯器和直譯器就可以對尾遞迴進行優化。使遞迴本身無論呼叫多少次都只占用乙個棧幀,從而避免棧溢位的情況。

>>> def fact(n):

... return fact_iter(n,1)

...>>>

>>> def fact_iter(num , result):

... if num == 1:

... return result

... return fact_iter(num-1 , num * result)

...>>>

>>>

>>> fact(1)

1>>> fact(2)

2>>> fact(5)

120

python遞迴函式例項 python遞迴函式

python遞迴函式 什麼是遞迴?遞迴,就是在函式執行中自己呼叫自己 示例 def recursion n 定義遞迴函式 print n 列印n recursion n 1 在函式的執行種呼叫遞迴 recursion 1 呼叫函式 這個函式在不斷的自己呼叫自己,每次呼叫n 1,看下執行結果 998t...

python靜態遞迴函式 python遞迴函式

一 遞迴的定義 1.什麼是遞迴 在乙個函式裡在呼叫這個函式本身 2.最大遞迴層數做了乙個限制 997,但是也可以自己限制 1 deffoo 2 print n 3 n 1 4 foo n 5 foo 1 驗證997 3.最大層數限制是python預設的,可以做修改,但是不建議你修改。因為如果用997...

python靜態遞迴函式 python 遞迴函式

前言 本篇關於遞迴基本借鑑下面部落格講解加入自己理解。1.遞迴函式定義 如果乙個函式在函式內部呼叫自己,那這個函式就是遞迴函式。如 defsum arg,stop print arg if arg arg arg sum arg,stop sum 1,20 2.遞迴的特性 1 必須有乙個明確的結束條...