首頁  >  文章  >  後端開發  >  Python遞歸函數的定義與用法的實例分析

Python遞歸函數的定義與用法的實例分析

黄舟
黄舟原創
2017-06-04 10:12:411663瀏覽

這篇文章主要介紹了Python遞歸函數定義與用法,結合具體實例形式分析了Python遞歸函數的原理、實現技巧與相關注意事項,需要的朋友可以參考下

本文實例講述了Python遞歸函數定義與用法。分享給大家供大家參考,具體如下:

遞歸函數

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

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

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

所以,fact(n)可以表示為n * 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)
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000L

如果我們計算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(10000)。

def digui(n):
  sum = 0
  if n<=0:
    return 1
  else:
    return n*digui(n-1)
print(digui(5))

以上是Python遞歸函數的定義與用法的實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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