衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是Python的遞歸函數

汽車電子技術 ? 來源:安迪python學習筆記 ? 作者:安迪python學習筆記 ? 2023-02-23 10:25 ? 次閱讀
  • 1.遞歸的形象解釋
  • 2.定義
  • 3.步驟
  • 4.終止條件
  • 5.優點
  • 6.缺點
  • 7.調用深度
  • 8.課堂實例
  • 9.計算n的階乘
    • 9.1什么是階乘
    • 9.2計算5!

1.遞歸的形象解釋

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

視頻作者:pipi的奇思妙想

大家可以網上搜一下該作者的視頻,搜不到的可以聯系我!

【目標任務】

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

2.定義

一個函數是可以調用另一函數的。

作為特例,如果一個函數調用了自己,那我們稱這個函數為遞歸函數。

【示例】

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

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

像這樣自己調用自己的表達式就是一個遞歸函數。

3.步驟

遞歸通常可以分為兩步:先遞后回歸。

視頻中的小玩偶從后往前詢問前一個小玩偶的坐位數,就是一個遞推的過程。

小玩偶從前往后告訴后一個小玩偶的它座位數,就是一個回歸的過程。

4.終止條件

遞歸函數必須有終止條件。

編程中,函數的調用要占用名叫棧(stack)的內存空間。

調用函數時,程序會將相關的數據存儲到計算機的棧里。

當函數運行結束時數據會從棧里取出。

如果函數調用永遠不停止,棧會被塞滿,數據就沒地方存儲。

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

棧溢出,程序會被操作系統強行終止。

因此,遞歸函數必須有終止條件。

5.優點

遞歸函數自己調用自己,代碼相對簡單。

6.缺點

遞歸函數每調用一次都會開相應的內存空間,因此遞歸函數的缺點就是占用內存較多。

7.調用深度

遞歸調用的次數,我們稱之為調用深度。

遞歸函數調用深度是有限制的,超出會有溢出。

8.課堂實例

我們用一個簡單的例子來體驗遞歸函數:

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

【代碼解析】

  1. 定義函數f,參數是x,注意自定義函數語句以英文冒號:結尾;
  2. 自定義函數要實現的功能是:返回f(x-1)+x

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

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

  1. 最后是調用函數,調用函數的語法為函數名(參數)

這里的函數名是f,要傳入的實際參數為3。

【參數傳遞過程】

當參數等于3的時候,函數的返回值是f(2)+3

3是確定的數值,f(2)的值無法確定,需要繼續調用函數。

當參數等于2的時候,函數的返回值是f(1)+2

當參數等于1的時候,函數的返回值是f(0)+1

當參數等于0的時候,函數的返回值是f(-1)+0

我們發現,函數每次都會無條件的調用自己。

f(x)永遠不會有具體的值,函數調用永遠不會停止。

要解決這個問題,我們必須給函數加入一個終止條件。

我們再代碼中加入一個判斷語句:

如果x>0,函數就調用自己。

否則,直接返回0。

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

【終端輸出】

6

分析程序執行的過程:

【遞推的過程】

f(3)=f(2)+3

f(2)=f(1)+2

f(1)=f(0)+1

f(0)=0

【回歸的過程】

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

因此,程序終端輸出的結果是6。

9.計算n的階乘

9.1什么是階乘

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

0的階乘為1。

自然數n的階乘寫作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計算5!

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

【終端輸出】

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

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

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

  1. 最后是調用函數,調用函數的語法為函數名(參數)

這里的函數名是f,要傳入的實際參數為5。

【參數傳遞過程】

當參數等于5的時候,函數的返回值是5×f(4)

當參數等于4的時候,函數的返回值是4×f(3)

當參數等于3的時候,函數的返回值是3×f(2)

當參數等于2的時候,函數的返回值是2×f(1)

當參數等于1的時候,函數的返回值是1,即f(1)=1

【程序的執行過程】

【遞推的過程】

f(5)=5×f(4)

f(4)=4×f(3)

f(3)=3×f(2)

f(2)=2×f(1)

f(1)=1

【回歸過程】

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

【總結】

很多同學會覺得寫代碼比計算更復雜,耗費時間更多。

那是因為我們要計算的階乘數比較簡單。

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

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

【終端輸出】

815915283247897734345611269596115894272000000000
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    88

    文章

    3637

    瀏覽量

    93983
  • 數據存儲
    +關注

    關注

    5

    文章

    983

    瀏覽量

    51061
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62973
收藏 人收藏

    評論

    相關推薦

    220. Python遞歸函數和匿名函數:15.1 了解遞歸 #硬聲創作季

    python
    充八萬
    發布于 :2023年07月05日 23:21:46

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

    python
    充八萬
    發布于 :2023年07月05日 23:22:55

    224. Python遞歸函數和匿名函數:15.5 遞歸出口問題

    python
    充八萬
    發布于 :2023年07月05日 23:25:15

    225. Python遞歸函數和匿名函數:15.6 了解lambda

    python
    充八萬
    發布于 :2023年07月05日 23:26:25

    231. Python遞歸函數和匿名函數:15.12 lambda參數之args

    python
    充八萬
    發布于 :2023年07月05日 23:32:14

    233. Python遞歸函數和匿名函數:15.14 lambda應用之帶判斷的lambda

    python
    充八萬
    發布于 :2023年07月05日 23:34:33

    220. Python遞歸函數和匿名函數:15.1 了解遞歸

    python
    充八萬
    發布于 :2023年07月11日 20:23:58

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

    python
    充八萬
    發布于 :2023年07月11日 20:25:56

    224. Python遞歸函數和匿名函數:15.5 遞歸出口問題 #硬聲創作季

    python
    充八萬
    發布于 :2023年07月11日 20:28:15

    226. Python遞歸函數和匿名函數:15.7 體驗lambda #硬聲創作季

    python
    充八萬
    發布于 :2023年07月11日 20:30:35

    229. Python遞歸函數和匿名函數:15.10 lambda參數之一個參數

    python
    充八萬
    發布于 :2023年07月11日 20:34:04

    快速掌握Python遞歸函數與匿名函數調用

    函數Python技術學習中重要的一個環節,深入掌握該階段的知識內容,對于Python技術能力的提升非常有幫助,這里就針對遞歸函數與匿名
    發表于 07-19 16:22
    缅甸百家乐赌博有假吗| 娱乐百家乐官网可以代理吗| 威尼斯人娱乐城网上赌博| 黎川县| 威尼斯人娱乐注册网址| 网上百家乐投注法| 新澳门百家乐官网软件下载| 博彩优惠| 百家乐赌博筹码大不大| 丽星百家乐官网的玩法技巧和规则| 东源县| 亚洲顶级赌场手机版| 百家乐单机游戏下| 百家乐只打一种牌型| 百家乐官网博娱乐网赌百家乐官网的玩法技巧和规则 | 百家乐官网电子游戏试| 博盈百家乐官网游戏| 必博365| 大发888注册步骤| 新锦江百家乐的玩法技巧和规则| 24山辅星水法分阴阳| 百家乐官网太阳城小郭| 宜兰县| 盛世国际娱乐城| 百家乐14克粘土筹码| 澳门百家乐群策略| 澳门百家乐官网网40125| 水晶百家乐官网筹码| 百家乐官网投注网站是多少| 伟博百家乐官网现金网| 建湖县| 汝阳县| 哈巴河县| 百家乐分析软件| 尊龙娱乐| 宝丰县| 永年县| 百家乐官网玩法及细则| 百家乐官网经验博彩正网| 百家乐官网玩法既规则| 金百亿百家乐官网娱乐城|