一. 函数递归调用介绍
1. 什么是函数的递归调用?
- 是函数嵌套调用的一种特殊形式.
- 指的是在调用一个函数的过程中又直接或间接的调用到本身.
2. 直接和间接调用示例
# 直接调用本身
def func():
print("from func")
func()
func() # 报错: RecursionError(在调用Python对象时超过最大递归深度)
# 间接调用本身
def func():
print("from func")
bar()
def bar():
print("from bar")
func()
bar() # 报错: RecursionError(在调用Python对象时超过最大递归深度)
3. 查看递归深与设置
"""
死循环与递归的差别:
死循环并不会产生新的内存空间, 而函数的递归要不断的申请内存空间. 所以函数的递归要设置最大递归深度.
"""
# 查看递归深度: 默认值1000
import sys
print(sys.getrecursionlimit()) # 1000
# 指定递归深度: 但最终会受限于主即操作系统大小的限制
sys.setrecursionlimit(2000)
print(sys.getrecursionlimit()) # 2000
4. 递归的本质就是循环
# 方式一: while, for循环
while True:
print(111)
print(222)
print(333)
# 方式二: 递归的本质就是循环
def func():
print(111)
print(222)
print(333)
func()
func()
5. 强调: 递归不应该无限的调用下去, 必须在满足某种条件下结束递归调用
# while循环示例
i = 0
# 1. while循环
while i < 10: # 2. 循环结束条件
print(i, end=' ') # 0 1 2 3 4 5 6 7 8 9
i += 1 # 3. 累加条件
# 递归本质就是循环示例
def func(i):
if i == 10: # 2. 指定同while循环一样的结束循环的条件
return
print(i, end=' ') # 0 1 2 3 4 5 6 7 8 9
i += 1 # 3. 指定同while循环一样的累加条件
func(i) # 1. 同while循环一样让函数循环起来
func(0)
二. 回溯与递推
"""
# 递归的过程分为2个阶段: 回溯 递推
回溯: 一层一层调用下去
递推: 满足某种结束条件, 结束递归调用, 然后一层一层返回
# 强调: 递归一定要有一个结束条件
"""
# 示例一: 有5个人, 第5个人说我的薪资比第4个人多1000, 第4个人说我的薪资比第3个人多1000, 第3个人说我的薪资比第2个人多1000, 第1个人说我的薪资是5000, 求第5个人的薪资?
def salary(n):
if n == 1: # 结束条件
return 5000
return salary(n - 1) + 1000 # salary(4) + 1000 + salary(3) + 1000 + salary(2) + 1000 + salary(1) + 1000
s = salary(5)
print(s) # 9000
# 示例二: 有5个人, 第5个人说我的年龄比第4个人大2岁, 第4个人说我的年龄比第3个人大2岁,第3个人说我的年龄比第2个人大2岁,第2个人说我的年龄比第1个人大2岁, 第1个人说我的年龄是38, 求第5个人年龄?
def age(n):
if n == 1: # 结束条件
return 38
return age(n-1) + 2 # 循环条件age(n-1) + 累加条件2
print(age(5)) # 46
# 应用场景: 需求, 取出列中的每一个值
items = [1, 2, [3, [4, [5, [6, [7, [8, [9, 10, 11, [12, [13, ]]]]]]]]]]
def func(li: list):
for item in li: # 结束条件: li被迭代取值完毕
if isinstance(item, list):
func(item) # 循环条件: 如果item不是列表, 那么继续递归
else:
print(item, end=' ')
func(items) # 1 2 3 4 5 6 7 8 9 10 11 12 13