1. 程式人生 > >python遞歸函數

python遞歸函數

python遞歸函數

python在函數內部,可以調用其他函數,如果一個函數在內部調用自身本身,這個函數就是遞歸函數

書寫一個階乘的遞歸函數def func(n):

    n == :
        n * func(n-)
(func())

使用遞歸函數需要註意防止棧溢出,在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當 進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀,由於棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出,案例如下

技術分享圖片


解決遞歸調用棧溢出的方法是通過尾遞歸優化,事實上尾遞歸和循環的效果是一樣的,所以,把循環看成是一種特殊的尾遞歸函數也是可以的。


尾遞歸是指,在函數返回的時候,調用自身本身,並且,return語句不能包含表達式。這樣,編譯器或者解釋器就可以把尾遞歸做優化,

使遞歸本身無論調用多少次,都只占用一個棧幀,不會出現棧溢出的情況

上面的func(n)函數由於return n*func(n-1)引入了乘法表達式,所以就不是尾遞歸。要改成尾遞歸需要多一點代碼,主要是要把每一步的乘機傳入遞歸函數中:

(n):
    fact_iter(n)
(numproduct):
    num  == :
        product
    fact_iter(num-num*product)
(fact())

尾遞歸調用時,如果做了優化,棧不會增長,因此,無論多少次調用也不會導致棧溢出

遺憾的是,包括python在內的大多數編程語言,都沒有對尾遞歸做優化,因此把上面的fact()函數改成尾遞歸方式,也會導致棧溢出

python遞歸函數