python 遞歸函數——從入門到懵逼


遞歸函數

image

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、遞推到回溯的流程圖:

image

案例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

image


學完以后,從一臉懵逼到九臉懵逼!但是仍然要持續更新······
image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM