python 递归函数——从入门到懵逼
递归函数
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
学完以后,从一脸懵逼到九脸懵逼!但是仍然要持续更新······