0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是Python的遞歸函數(shù)

汽車電子技術(shù) ? 來(lái)源:安迪python學(xué)習(xí)筆記 ? 作者:安迪python學(xué)習(xí)筆記 ? 2023-02-23 10:25 ? 次閱讀
  • 1.遞歸的形象解釋
  • 2.定義
  • 3.步驟
  • 4.終止條件
  • 5.優(yōu)點(diǎn)
  • 6.缺點(diǎn)
  • 7.調(diào)用深度
  • 8.課堂實(shí)例
  • 9.計(jì)算n的階乘
    • 9.1什么是階乘
    • 9.2計(jì)算5!

1.遞歸的形象解釋

我們首先看一段視頻,來(lái)形象理解什么是遞歸。

視頻作者:pipi的奇思妙想

大家可以網(wǎng)上搜一下該作者的視頻,搜不到的可以聯(lián)系我!

【目標(biāo)任務(wù)】

電影院里,小玩偶想知道自己的位置在第幾排。

2.定義

一個(gè)函數(shù)是可以調(diào)用另一函數(shù)的。

作為特例,如果一個(gè)函數(shù)調(diào)用了自己,那我們稱這個(gè)函數(shù)為遞歸函數(shù)。

【示例】

f(x)=f(x+1)+x

f(x)和f(x+1)的函數(shù)名都是f,只是參數(shù)不同,一個(gè)是x,一個(gè)是x+1。

像這樣自己調(diào)用自己的表達(dá)式就是一個(gè)遞歸函數(shù)。

3.步驟

遞歸通??梢苑譃閮刹剑合冗f后回歸。

視頻中的小玩偶從后往前詢問(wèn)前一個(gè)小玩偶的坐位數(shù),就是一個(gè)遞推的過(guò)程。

小玩偶從前往后告訴后一個(gè)小玩偶的它座位數(shù),就是一個(gè)回歸的過(guò)程。

4.終止條件

遞歸函數(shù)必須有終止條件。

編程中,函數(shù)的調(diào)用要占用名叫棧(stack)的內(nèi)存空間。

調(diào)用函數(shù)時(shí),程序會(huì)將相關(guān)的數(shù)據(jù)存儲(chǔ)到計(jì)算機(jī)的棧里。

當(dāng)函數(shù)運(yùn)行結(jié)束時(shí)數(shù)據(jù)會(huì)從棧里取出。

如果函數(shù)調(diào)用永遠(yuǎn)不停止,棧會(huì)被塞滿,數(shù)據(jù)就沒(méi)地方存儲(chǔ)。

我們將這種情況稱為棧溢出。

棧溢出,程序會(huì)被操作系統(tǒng)強(qiáng)行終止。

因此,遞歸函數(shù)必須有終止條件。

5.優(yōu)點(diǎn)

遞歸函數(shù)自己調(diào)用自己,代碼相對(duì)簡(jiǎn)單。

6.缺點(diǎn)

遞歸函數(shù)每調(diào)用一次都會(huì)開(kāi)相應(yīng)的內(nèi)存空間,因此遞歸函數(shù)的缺點(diǎn)就是占用內(nèi)存較多。

7.調(diào)用深度

遞歸調(diào)用的次數(shù),我們稱之為調(diào)用深度。

遞歸函數(shù)調(diào)用深度是有限制的,超出會(huì)有溢出。

8.課堂實(shí)例

我們用一個(gè)簡(jiǎn)單的例子來(lái)體驗(yàn)遞歸函數(shù):

def f(x) :    
    return f(x-1)+x          
print(f(3))

【代碼解析】

  1. 定義函數(shù)f,參數(shù)是x,注意自定義函數(shù)語(yǔ)句以英文冒號(hào):結(jié)尾;
  2. 自定義函數(shù)要實(shí)現(xiàn)的功能是:返回f(x-1)+x

f(x)和f(x-1)函數(shù)名相同,只是參數(shù)不同。

因此,在自定義函數(shù)f(x)中,它自己調(diào)用了自己。

  1. 最后是調(diào)用函數(shù),調(diào)用函數(shù)的語(yǔ)法為函數(shù)名(參數(shù))

這里的函數(shù)名是f,要傳入的實(shí)際參數(shù)為3。

【參數(shù)傳遞過(guò)程】

當(dāng)參數(shù)等于3的時(shí)候,函數(shù)的返回值是f(2)+3

3是確定的數(shù)值,f(2)的值無(wú)法確定,需要繼續(xù)調(diào)用函數(shù)。

當(dāng)參數(shù)等于2的時(shí)候,函數(shù)的返回值是f(1)+2

當(dāng)參數(shù)等于1的時(shí)候,函數(shù)的返回值是f(0)+1

當(dāng)參數(shù)等于0的時(shí)候,函數(shù)的返回值是f(-1)+0

我們發(fā)現(xiàn),函數(shù)每次都會(huì)無(wú)條件的調(diào)用自己。

f(x)永遠(yuǎn)不會(huì)有具體的值,函數(shù)調(diào)用永遠(yuǎn)不會(huì)停止。

要解決這個(gè)問(wèn)題,我們必須給函數(shù)加入一個(gè)終止條件。

我們?cè)俅a中加入一個(gè)判斷語(yǔ)句:

如果x>0,函數(shù)就調(diào)用自己。

否則,直接返回0。

def f(x) :
    if x>0:
        return f(x-1)+x
    else:
        return 0
print(f(3))

【終端輸出】

6

分析程序執(zhí)行的過(guò)程:

【遞推的過(guò)程】

f(3)=f(2)+3

f(2)=f(1)+2

f(1)=f(0)+1

f(0)=0

【回歸的過(guò)程】

f(0)=0

f(1)=f(0)+1=0+1=1

f(2)=f(1)+2=1+2=3

f(3)=f(2)+3=3+3=6

因此,程序終端輸出的結(jié)果是6。

9.計(jì)算n的階乘

9.1什么是階乘

一個(gè)正整數(shù)的階乘(factorial)是所有小于及等于該數(shù)的正整數(shù)的積。

0的階乘為1。

自然數(shù)n的階乘寫(xiě)作n!

n!=1×2×3×...×n

階乘可以用遞歸方式定義:0!=1,n!=(n-1)!×n。

【示例】

1!=1

2!=1!×2=1×2=2

3!=2!×3=2×3=6

4!=3!×4=6×4=24

5!=4!×5=24×5=120

9.2計(jì)算5!

def f(n) :
    if n == 1 :
        return 1
    else:
        return n*f(n-1)
print(f(5))

【終端輸出】

120
  1. 定義函數(shù)f,參數(shù)是n,注意自定義函數(shù)語(yǔ)句以英文冒號(hào):結(jié)尾;
  2. 遞歸函數(shù)的終止條件:如果n=1,返回值為1
  3. 自定義函數(shù)要實(shí)現(xiàn)的功能是n*f(n-1)

f(n)和f(n-1)函數(shù)名相同,只是參數(shù)不同。

因此,在自定義函數(shù)f(n)中,它自己調(diào)用了自己。

  1. 最后是調(diào)用函數(shù),調(diào)用函數(shù)的語(yǔ)法為函數(shù)名(參數(shù))

這里的函數(shù)名是f,要傳入的實(shí)際參數(shù)為5。

【參數(shù)傳遞過(guò)程】

當(dāng)參數(shù)等于5的時(shí)候,函數(shù)的返回值是5×f(4)

當(dāng)參數(shù)等于4的時(shí)候,函數(shù)的返回值是4×f(3)

當(dāng)參數(shù)等于3的時(shí)候,函數(shù)的返回值是3×f(2)

當(dāng)參數(shù)等于2的時(shí)候,函數(shù)的返回值是2×f(1)

當(dāng)參數(shù)等于1的時(shí)候,函數(shù)的返回值是1,即f(1)=1

【程序的執(zhí)行過(guò)程】

【遞推的過(guò)程】

f(5)=5×f(4)

f(4)=4×f(3)

f(3)=3×f(2)

f(2)=2×f(1)

f(1)=1

【回歸過(guò)程】

f(1)=1

f(2)=2×f(1)=2×1=2

f(3)=3×f(2)=3×2=6

f(4)=4×f(3)=4×6=24

f(5)=5×f(4)=5×24=120

【總結(jié)】

很多同學(xué)會(huì)覺(jué)得寫(xiě)代碼比計(jì)算更復(fù)雜,耗費(fèi)時(shí)間更多。

那是因?yàn)槲覀円?jì)算的階乘數(shù)比較簡(jiǎn)單。

那如果我們要計(jì)算的是40!,大家觀察下面的代碼的輸出結(jié)果,看看是否還能自己計(jì)算呢?

def f(n) :
    if n == 1 :
        return 1
    else:
        return n*f(n-1)
print(f(40))

【終端輸出】

815915283247897734345611269596115894272000000000
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3616

    瀏覽量

    93742
  • 數(shù)據(jù)存儲(chǔ)

    關(guān)注

    5

    文章

    971

    瀏覽量

    50911
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4331

    瀏覽量

    62633
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    220. Python遞歸函數(shù)和匿名函數(shù):15.1 了解遞歸 #硬聲創(chuàng)作季

    python
    充八萬(wàn)
    發(fā)布于 :2023年07月05日 23:21:46

    221. Python遞歸函數(shù)和匿名函數(shù):15.2 遞歸之回顧函數(shù)返回值

    python
    充八萬(wàn)
    發(fā)布于 :2023年07月05日 23:22:55

    224. Python遞歸函數(shù)和匿名函數(shù):15.5 遞歸出口問(wèn)題

    python
    充八萬(wàn)
    發(fā)布于 :2023年07月05日 23:25:15

    225. Python遞歸函數(shù)和匿名函數(shù):15.6 了解lambda

    python
    充八萬(wàn)
    發(fā)布于 :2023年07月05日 23:26:25

    231. Python遞歸函數(shù)和匿名函數(shù):15.12 lambda參數(shù)之a(chǎn)rgs

    python
    充八萬(wàn)
    發(fā)布于 :2023年07月05日 23:32:14

    233. Python遞歸函數(shù)和匿名函數(shù):15.14 lambda應(yīng)用之帶判斷的lambda

    python
    充八萬(wàn)
    發(fā)布于 :2023年07月05日 23:34:33

    220. Python遞歸函數(shù)和匿名函數(shù):15.1 了解遞歸

    python
    充八萬(wàn)
    發(fā)布于 :2023年07月11日 20:23:58

    221. Python遞歸函數(shù)和匿名函數(shù):15.2 遞歸之回顧函數(shù)返回值

    python
    充八萬(wàn)
    發(fā)布于 :2023年07月11日 20:25:56

    快速掌握Python遞歸函數(shù)與匿名函數(shù)調(diào)用

    函數(shù)Python技術(shù)學(xué)習(xí)中重要的一個(gè)環(huán)節(jié),深入掌握該階段的知識(shí)內(nèi)容,對(duì)于Python技術(shù)能力的提升非常有幫助,這里就針對(duì)遞歸函數(shù)與匿名
    發(fā)表于 07-19 16:22