這篇文章主要介紹了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中文網其他相關文章!