遞歸函數(shù)

學(xué)習(xí)目標(biāo)

1、掌握遞歸函數(shù)的使用。

2、理解尾遞歸優(yōu)化。

遞歸函數(shù)

在函數(shù)內(nèi)部可以調(diào)用其他函數(shù),如果函數(shù)內(nèi)部調(diào)用自身,則這個函數(shù)就是遞歸函數(shù)。

計算階乘n!=1x2x3x...x(n-1)xn,用fact(n)表示

fact(n)=n!=1x2x3x...x(n-1)xn=(n-1)!xn=fact(n-1)xn

因此fact(n)=nxfact(n-1)

def fact(n):

? ? if n==1 :

? ? ? ? return 1

? ? return n * fact(n-1)

print(fact(5))

print(fact(100))

print(fact(1000)) #棧溢出

執(zhí)行結(jié)果

遞歸函數(shù)的優(yōu)點是定義簡單、邏輯清晰,但是使用遞歸函數(shù)需要注意防止棧溢出。解決遞歸調(diào)用棧溢出的方法是尾遞歸優(yōu)化,尾遞歸是指函數(shù)返回時調(diào)用本身且return語句不能包含表達(dá)式。

尾遞歸如果做了優(yōu)化時,棧不會增長,所以無論調(diào)多少次都不會出現(xiàn)棧溢出的問題。

上面的fact(n)函數(shù)返回return n*fact(n-1)引入了乘法表達(dá)式,就不是尾遞歸。

def fact(n) :

? ? return fact_iter(n, 1)

def fact_iter(num, product) :

? ? if num==1 :

? ? ? ? return product

? ? return fact_iter(num-1, num * product)

print(fact(5))

print(fact(100))

print(fact(1000)) #棧溢出

執(zhí)行結(jié)果

Python標(biāo)準(zhǔn)的解釋器沒有針對尾遞歸做優(yōu)化,所以任何遞歸函數(shù)都存在棧溢出的問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在函數(shù)內(nèi)部,可以調(diào)用其他函數(shù)。如果一個函數(shù)在內(nèi)部調(diào)用自身本身,這個函數(shù)就是遞歸函數(shù)。 舉個例子,我們來計算階乘n!...
    Aedda閱讀 354評論 0 0
  • 一、lambda函數(shù) lambda 函數(shù)是一種快速定義單行的最小函數(shù),是從 Lisp 借用來的,可以用在任何需要函...
    花間派I風(fēng)月閱讀 1,129評論 0 3
  • 題目: 計算階乘n!=n*(n-1)*(n-2)*…3*2*1 用遞歸函數(shù)來表示為: def f(x): if ...
    kevin282閱讀 2,325評論 0 2
  • http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958...
    喵在野閱讀 565評論 0 4
  • 在函數(shù)內(nèi)部,可以調(diào)用其他函數(shù)。如果一個函數(shù)在內(nèi)部調(diào)用自身本身,這個函數(shù)就是遞歸函數(shù)。 舉個例子,我們來計算階乘n!...
    Zhigang_Han閱讀 845評論 0 0

友情鏈接更多精彩內(nèi)容