python 遞迴函式——從入門到懵逼
阿新 • • 發佈:2021-11-18
遞迴函式-看完這篇文章就明白了!
目錄
遞迴函式
1、定義:函式在執行的過程中,直接和間接呼叫了自身,就是遞迴函式
python預設的最大遞迴深度為1000次
例項如下:
import sys
# 獲取最大遞迴深度
print(sys.getrecursionlimit())
# 結果
1000
# 修改最大遞迴深度為2000
sys.setrecursionlimit(2000)
print(sys.getrecursionlimit())
# 結果
2000
1. 遞迴函式的特性:
- 必須有一個結束的條件
- 每一次遞迴都必須離“結果”更近一步
- 通常前一次的輸出作為後一次的輸入
- 如果沒有結束的條件或者遞迴次數過多會導致記憶體溢位
2. 遞迴函式執行過程:
- 遞推
- 一層一層往下推導答案,每一次推導必須離結果更近
- 回溯
- 依據遞推的結論往回推導最初要求的答案,前一次的輸出做為了後一次的輸入
3. 大白話解釋遞推函式執行過程:
案例1:
求小孩A的年齡?
A說:我的年齡比B大2歲;B說:我的年齡比C大2歲
C說:我的年齡比D大2歲;D說:我3歲
那麼從A說的條件到D說他的年齡這個過程為遞推,然後3+2+2+2求A的年齡這個過程為回溯。
程式碼實現如下:用for迴圈和遞迴函式實現
''' 虛擬碼: d_age = 3 c_age = d_age +2 = 5 b_age = c_age +2 =7 a_age = b_age + 2 =9 ''' # for迴圈實現 d_age = 3 for i in range(3): d_age+=2 print(d_age) # 遞迴函式實現 def get_age(n): # d的年齡為3,d為n=1 if n==1: return 3 # 求a的年齡就是d的年齡+2+2+2 return get_age(n-1)+2 print(get_age(4))
2、遞推到回溯的流程圖:
案例2:
求100的前n項和,用for迴圈和遞迴函式實現
sum_num = 0
for i in range(101):
sum_num += i
print(sum_num) # 結果5050
def total_num(n):
if n >0:
return n+total_num(n-1)
else:
return 0
print(total_num(100)) # 結果5050
案例3:
求6的階乘,for迴圈和遞迴函式實現
# 求6的階乘 n=6 for i in range(1,n): if i ==1: continue else: n = n*i print(n) def get_num(n): if n == 1: return n return get_num(n-1)*n print(get_num(6)) #結果 720 720
案例4:
打印出列表中每一個元素(列表除外),for迴圈和遞迴函式實現
# for迴圈實現
l = [1,[2,[3]]]
for i in l:
if type(i) is int:
print(i)
else:
for j in i:
if type(j) is int:
print(j)
else:
for k in j:
if type(k) is int:
print(k)
#結果
1
2
3
# 遞迴函式實現
l = [1,[2,[3]]]
def get_num(n):
for i in n:
if type(i) is int:
print(i)
else:
# 獲取剩下的列表
get_num(i)
get_num(l)
#結果
1
2
3
學完以後,從一臉懵逼到九臉懵逼!但是仍然要持續更新······