Python中的遞歸函數(shù)使用詳解
一、什么是遞歸
在函數(shù)內部調用自己的函數(shù)。
二、什么是遞歸調用
一種特殊的嵌套調用,是指某個函數(shù)調用自己或者調用其他函數(shù)后再次調用自己。
由于不能無限嵌套調用,所以某個遞歸函數(shù)一定存在至少兩個分支,一個是退出嵌套,不再直接或者間接調用自己;另外一個則是繼續(xù)嵌套。
一般通過函數(shù)的輸入?yún)?shù)來決定走哪個分支,所以遞歸函數(shù)一般都是帶有參數(shù)的。
三、應用實例
1、遞歸函數(shù):求和
def funs(n): #1+2+3+4=10 # 退出遞歸的分支 if n==1: return 1 # 遞歸調用 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 # 遞歸調用 return n*get_factorial(n-1) # 求4的階乘 print(get_factorial(4))
3、斐波拉契級數(shù)
有這樣一個數(shù)列:1,1,2,3,5,8,13,21,34…。其第一元素和第二個元素等于 1,其他元素等于其前面兩個元素的和。用數(shù)學公式表示如下:
# 分析: # 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 # 回溯:一層一層的調用下去 # 遞推:滿足某種結束條件后,結束遞歸調用,然后一層一層返回。 def get_age(n): if n==1: #結束遞歸調用 return 16 else: #遞歸調用 return get_age(n-1)+8 print(get_age(1)) #第1個人年齡 print(get_age(4)) #第4個人年齡
4、詢問年齡: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 # 回溯:一層一層的調用下去 # 遞推:滿足某種結束條件后,結束遞歸調用,然后一層一層返回。 def get_age(n): if n==1: #結束遞歸調用 return 16 else: #遞歸調用 return get_age(n-1)+8 print(get_age(1)) #第1個人年齡 print(get_age(4)) #第4個人年齡
5、對于一個有n個元素的列表,全排列得到所有的這些排列的列表。
一般對于 n 個元素的列表有 n! 種排列方式。如對于 [1,2,3] 有下面幾種排列方法:
def get_combination(ll,start): """ :param ll: 排序的列表 :param start: 起始位置一般為0 :return: 空 """ end=len(ll) #記錄元素個數(shù) if start==end: #遞歸的結束條件 print(ll) else: i=start #指向本次需要排列的第一個位置(本輪需要固定的位置) # 循環(huán)排列的序列中的每一個數(shù), for n in range(start,end): # 依次交換數(shù)據(jù) ll[n],ll[i]=ll[i],ll[n] #遞歸調用 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)
全排列
四、引用標準庫函數(shù):itertools庫
1、全排列可以使用這個標準庫函數(shù)
import itertools print(list(itertools.permutations([1, 2, 3], 3))) print(list(itertools.permutations(range(3), 2)))
五、遞歸函數(shù)調用深度的默認最大值為 1000
1、當調用階乘使用10萬時 ,print(get_factorial(100000)),發(fā)生以下異常:
說明:
注意遞歸的深度。
由于遞歸會產生多次函數(shù)調用,而函數(shù)調用會消耗代碼的??臻g,如果遞歸的深度太大,會導致棧溢出。
以上面的階乘為例,如果計算 100000 的階乘,在一般機器上都會出現(xiàn)棧溢出的問題
默認情況下,函數(shù)調用深度的最大值為 1000,如果達到或者超過 1000 就會出現(xiàn)上面的錯誤信息。
import sys # 得到最大調用深度 print(sys.getrecursionlimit())
如果希望修改該系統(tǒng)值,也可以通過 sys 模塊的接口函數(shù)來實現(xiàn)。 如希望最大函數(shù)調用深度為 100000,那么可以使用下面的代碼進行修改:
# 設定最大調用深度 sys.setrecursionlimit(10000)
到此這篇關于Python中的遞歸函數(shù)使用詳解的文章就介紹到這了,更多相關Python遞歸函數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解python 拆包可迭代數(shù)據(jù)如tuple, list
拆包是指將一個結構中的數(shù)據(jù)拆分為多個單獨變量中。下面通過本文給大家介紹python 拆包可迭代數(shù)據(jù)如tuple, list的相關資料,需要的朋友參考下吧2017-12-12python如何修改PYTHONPATH環(huán)境變量
這篇文章主要介紹了python如何修改PYTHONPATH環(huán)境變量問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08Python實現(xiàn)B站UP主小助手詳解開發(fā)流程
功能是不是還挺豐富的,從寫第一行代碼到完成也就花了兩天不到的時間,這也證明了使用python開發(fā)的高效率,下面來說說這些功能開發(fā)中我遇到了哪些問題,我又是如何解決的2022-02-02python?(pyqt)?表格顯示圖片的實現(xiàn)方式
這篇文章主要介紹了python?(pyqt)?表格顯示圖片的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09Django框架實現(xiàn)的普通登錄案例【使用POST方法】
這篇文章主要介紹了Django框架實現(xiàn)的普通登錄案例,結合實例形式分析了Django框架使用POST方法進行頁面登錄、校驗等相關操作技巧,需要的朋友可以參考下2019-05-05Python的socket模塊源碼中的一些實現(xiàn)要點分析
我們平時引入Python的socket模塊利用其中的方法可以輕松地寫出搭建socket通信的程序,今天我們就來看一下Python的socket模塊源碼中的一些實現(xiàn)要點分析,領略Python簡潔代碼的一些背后功勞.2016-06-06