首頁  >  文章  >  後端開發  >  Python遞歸演算法很難嗎,實例詳解Python遞歸函數

Python遞歸演算法很難嗎,實例詳解Python遞歸函數

Tomorin
Tomorin原創
2018-08-17 17:53:322388瀏覽

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

舉個例子,我們來計算階乘n! = 1 x 2 x 3 x ... x n,用函數fact(n)表示,可以看出:

fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n

所以,fact(n)可以表示為n x fact(n-1),只有n=1時需要特殊處理。

於是,fact(n)用遞迴的方式寫出來就是:

def fact(n):
    if n==1:     
       return 1
    return n * fact(n - 1)

上面就是一個遞迴函數。可以試試看:

>>> fact(1)
1
>>> fact(5)
120
>>> fact(100)
933262154439441526816992388562667004907159682643816214685
92963895217599993229915608941463976156518286253697920827223
758251185210916864000000000000000000000000

如果我們計算fact(5),可以根據函數定義看到計算過程如下:

===> fact(5)
=== > 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120


遞迴函數的優點是定義簡單,邏輯清晰。理論上,所有的遞歸函數都可以寫成循環的方式,但循環的邏輯不如遞歸清晰。

使用遞歸函數需要注意防止堆疊溢位。在電腦中,函數調用是透過棧(stack)這種資料結構實現的,每當進入函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞歸呼叫的次數過多,會導致棧溢位。可以試試fact(1000):

>>> fact(1000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in fact
  ...
  File "<stdin>", line 4, in fact
RuntimeError: maximum recursion depth exceeded in comparison


以上是Python遞歸演算法很難嗎,實例詳解Python遞歸函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn