亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中的遞歸函數(shù)使用詳解

 更新時(shí)間:2023年12月06日 09:27:11   作者:凌冰_  
這篇文章主要介紹了Python中的遞歸函數(shù)使用詳解,遞歸函數(shù)是指某個(gè)函數(shù)調(diào)用自己或者調(diào)用其他函數(shù)后再次調(diào)用自己,由于不能無(wú)限嵌套調(diào)用,所以某個(gè)遞歸函數(shù)一定存在至少兩個(gè)分支,一個(gè)是退出嵌套,不再直接或者間接調(diào)用自己;另外一個(gè)則是繼續(xù)嵌套,需要的朋友可以參考下

一、什么是遞歸

在函數(shù)內(nèi)部調(diào)用自己的函數(shù)。

二、什么是遞歸調(diào)用

一種特殊的嵌套調(diào)用,是指某個(gè)函數(shù)調(diào)用自己或者調(diào)用其他函數(shù)后再次調(diào)用自己。

由于不能無(wú)限嵌套調(diào)用,所以某個(gè)遞歸函數(shù)一定存在至少兩個(gè)分支,一個(gè)是退出嵌套,不再直接或者間接調(diào)用自己;另外一個(gè)則是繼續(xù)嵌套。

一般通過(guò)函數(shù)的輸入?yún)?shù)來(lái)決定走哪個(gè)分支,所以遞歸函數(shù)一般都是帶有參數(shù)的。

三、應(yīng)用實(shí)例

1、遞歸函數(shù):求和

def  funs(n):
    #1+2+3+4=10
    # 退出遞歸的分支
    if n==1:
       return 1
    # 遞歸調(diào)用
    return n+funs(n-1)
 
 # 求4的和
print(funs(4))

2、遞歸函數(shù):求階乘

def get_factorial(n):  # 定義階乘函數(shù)
    #1*2*3*4=24
    # 退出遞歸的分支
    if n==1:
        return 1
    # 遞歸調(diào)用
    return n*get_factorial(n-1)
 
 # 求4的階乘
print(get_factorial(4))

3、斐波拉契級(jí)數(shù)

有這樣一個(gè)數(shù)列:1,1,2,3,5,8,13,21,34…。其第一元素和第二個(gè)元素等于 1,其他元素等于其前面兩個(gè)元素的和。用數(shù)學(xué)公式表示如下:

# 分析:
# A  age(4) = age(4-1) +8
# B  age(3) = age(3-1) + 8
# C  age(2) = age(2-1) + 8
# D  age(1) = 16
# 回溯:一層一層的調(diào)用下去
# 遞推:滿足某種結(jié)束條件后,結(jié)束遞歸調(diào)用,然后一層一層返回。
def get_age(n):
    if n==1:  #結(jié)束遞歸調(diào)用
        return 16
    else:  #遞歸調(diào)用
        return get_age(n-1)+8
 
print(get_age(1))  #第1個(gè)人年齡
print(get_age(4))  #第4個(gè)人年齡

4、詢問(wèn)年齡:A比B大8歲,B比C大8歲,C比D大8歲,D是16歲

# 分析:
# A  age(4) = age(4-1) +8
# B  age(3) = age(3-1) + 8
# C  age(2) = age(2-1) + 8
# D  age(1) = 16
# 回溯:一層一層的調(diào)用下去
# 遞推:滿足某種結(jié)束條件后,結(jié)束遞歸調(diào)用,然后一層一層返回。
def get_age(n):
    if n==1:  #結(jié)束遞歸調(diào)用
        return 16
    else:  #遞歸調(diào)用
        return get_age(n-1)+8
 
print(get_age(1))  #第1個(gè)人年齡
print(get_age(4))  #第4個(gè)人年齡

5、對(duì)于一個(gè)有n個(gè)元素的列表,全排列得到所有的這些排列的列表。

一般對(duì)于 n 個(gè)元素的列表有 n! 種排列方式。如對(duì)于 [1,2,3] 有下面幾種排列方法:

def get_combination(ll,start):
    """
    :param ll:  排序的列表
    :param start: 起始位置一般為0
    :return: 空
    """
    end=len(ll)  #記錄元素個(gè)數(shù)
    if start==end:   #遞歸的結(jié)束條件
        print(ll)
    else:
        i=start  #指向本次需要排列的第一個(gè)位置(本輪需要固定的位置)
    # 循環(huán)排列的序列中的每一個(gè)數(shù),
    for n in range(start,end):
        # 依次交換數(shù)據(jù)
        ll[n],ll[i]=ll[i],ll[n]
        #遞歸調(diào)用
        get_combination(ll,start+1)
        # 回到上一步,交換數(shù)據(jù)
        ll[n],ll[i]=ll[i],ll[n]
 
 
#1*2*3=6
get_combination([1,2,3],0)
 
#1*2*3*4=24
get_combination(['red','yellow','green','blue'],0)

全排列

四、引用標(biāo)準(zhǔn)庫(kù)函數(shù):itertools庫(kù)

1、全排列可以使用這個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù)

import itertools
print(list(itertools.permutations([1, 2, 3], 3)))
 
print(list(itertools.permutations(range(3), 2)))

五、遞歸函數(shù)調(diào)用深度的默認(rèn)最大值為 1000

1、當(dāng)調(diào)用階乘使用10萬(wàn)時(shí) ,print(get_factorial(100000)),發(fā)生以下異常:

說(shuō)明:

注意遞歸的深度。

由于遞歸會(huì)產(chǎn)生多次函數(shù)調(diào)用,而函數(shù)調(diào)用會(huì)消耗代碼的棧空間,如果遞歸的深度太大,會(huì)導(dǎo)致棧溢出。

以上面的階乘為例,如果計(jì)算 100000 的階乘,在一般機(jī)器上都會(huì)出現(xiàn)棧溢出的問(wèn)題

默認(rèn)情況下,函數(shù)調(diào)用深度的最大值為 1000,如果達(dá)到或者超過(guò) 1000 就會(huì)出現(xiàn)上面的錯(cuò)誤信息。

import sys
 
# 得到最大調(diào)用深度
print(sys.getrecursionlimit())

如果希望修改該系統(tǒng)值,也可以通過(guò) sys 模塊的接口函數(shù)來(lái)實(shí)現(xiàn)。 如希望最大函數(shù)調(diào)用深度為 100000,那么可以使用下面的代碼進(jìn)行修改:

# 設(shè)定最大調(diào)用深度
sys.setrecursionlimit(10000)

到此這篇關(guān)于Python中的遞歸函數(shù)使用詳解的文章就介紹到這了,更多相關(guān)Python遞歸函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解python 拆包可迭代數(shù)據(jù)如tuple, list

    詳解python 拆包可迭代數(shù)據(jù)如tuple, list

    拆包是指將一個(gè)結(jié)構(gòu)中的數(shù)據(jù)拆分為多個(gè)單獨(dú)變量中。下面通過(guò)本文給大家介紹python 拆包可迭代數(shù)據(jù)如tuple, list的相關(guān)資料,需要的朋友參考下吧
    2017-12-12
  • python如何修改PYTHONPATH環(huán)境變量

    python如何修改PYTHONPATH環(huán)境變量

    這篇文章主要介紹了python如何修改PYTHONPATH環(huán)境變量問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 詳解pyinstaller生成exe的閃退問(wèn)題解決方案

    詳解pyinstaller生成exe的閃退問(wèn)題解決方案

    這篇文章主要介紹了詳解pyinstaller生成exe的閃退問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Python實(shí)現(xiàn)B站UP主小助手詳解開(kāi)發(fā)流程

    Python實(shí)現(xiàn)B站UP主小助手詳解開(kāi)發(fā)流程

    功能是不是還挺豐富的,從寫(xiě)第一行代碼到完成也就花了兩天不到的時(shí)間,這也證明了使用python開(kāi)發(fā)的高效率,下面來(lái)說(shuō)說(shuō)這些功能開(kāi)發(fā)中我遇到了哪些問(wèn)題,我又是如何解決的
    2022-02-02
  • python?(pyqt)?表格顯示圖片的實(shí)現(xiàn)方式

    python?(pyqt)?表格顯示圖片的實(shí)現(xiàn)方式

    這篇文章主要介紹了python?(pyqt)?表格顯示圖片的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python語(yǔ)言實(shí)現(xiàn)科學(xué)計(jì)算器

    Python語(yǔ)言實(shí)現(xiàn)科學(xué)計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了Python語(yǔ)言實(shí)現(xiàn)科學(xué)計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Python使用unittest進(jìn)行有效測(cè)試的示例詳解

    Python使用unittest進(jìn)行有效測(cè)試的示例詳解

    這篇文章主要介紹了如何使用?unittest?來(lái)編寫(xiě)和運(yùn)行單元測(cè)試,希望通過(guò)閱讀本文,大家能了解?unittest?的基本使用方法,以及如何使用?unittest?中的斷言方法和測(cè)試用例組織結(jié)構(gòu)
    2023-06-06
  • Django框架實(shí)現(xiàn)的普通登錄案例【使用POST方法】

    Django框架實(shí)現(xiàn)的普通登錄案例【使用POST方法】

    這篇文章主要介紹了Django框架實(shí)現(xiàn)的普通登錄案例,結(jié)合實(shí)例形式分析了Django框架使用POST方法進(jìn)行頁(yè)面登錄、校驗(yàn)等相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • Python的socket模塊源碼中的一些實(shí)現(xiàn)要點(diǎn)分析

    Python的socket模塊源碼中的一些實(shí)現(xiàn)要點(diǎn)分析

    我們平時(shí)引入Python的socket模塊利用其中的方法可以輕松地寫(xiě)出搭建socket通信的程序,今天我們就來(lái)看一下Python的socket模塊源碼中的一些實(shí)現(xiàn)要點(diǎn)分析,領(lǐng)略Python簡(jiǎn)潔代碼的一些背后功勞.
    2016-06-06
  • Pandas異常值處理小結(jié)

    Pandas異常值處理小結(jié)

    在Pandas中,異常值是數(shù)據(jù)中那些與其他數(shù)據(jù)點(diǎn)顯著不同的點(diǎn)本文主要介紹了Pandas異常值處理小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07

最新評(píng)論