递归的定义
什么是递归:函数递归是指“直接调用或间接调用”函数本身
直接调用:指的是在函数内置,直接调用函数本身
间接调用:两个函数之间相互调用间接造成递归
代码特点:
1 函数内部的代码是相同的,只是针对参数不同,处理的结果不同
2 当参数满足一个条件是,函数不在执行
这个通常被称为递归的出口,否则会出现死循环
- 这是一种函数嵌套调用的表现形式
- 最大递归层数限制:998,
获取递归深度: 了解
sys.getrecursionlimit()
设置递归深度: 了解
sys.setrecursionlimit(深度值)
下面是一个递归函数的实例:
def calc(n):
print(n)
if int(n/2) > 0: # 回溯,每一次执行都要拿到一个更接近于结果的结果
calc(int(n/2))
else:
print('------')
print(n) # 当回溯找到一个终止条件后,开始一步一步往上递推
calc(10)
打印结果:
10
5
2
1
------
1
2
5
10
递归分解
def calc(10):
print(10)
if int(10/2) > 0:
def calc(5):
print(5)
if int(5/2) > 0:
def calc(2):
print(2)
if int(2/2) > 0:
def calc(1):
print(1)
print('------')
print(1)
print(2)
print(5)
print(10)
最大递归
def foo(n):
print(n)
n += 1
foo(n)
foo(1)
遵循两个条件
想要递归有意义,必须遵循两个条件:
回溯:
指的是重复地执行, 每一次执行都要拿到一个更接近于结果的结果,
回溯必要有一个终止条件。递推:
当回溯找到一个终止条件后,开始一步一步往上递推。
练习
利用递归函数打印出列表中的每一个元素,l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]]
l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]
def get_all(l):
for item in l:
if isinstance(item, (tuple, list, dict, set)) == True:
get_all(item)
else:
print(item)
get_all(l)
# 循环取出第一个元素,判断是否是元组列表等
# 如果 1 不是,else 打印出来
# 此时 循环的结果是 [2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]
# 是一个列表,将递归调用 get_all 函数,取出2 打印出来
小结
使用递归函数的优点是 逻辑简单清晰,缺点是过深的调用会 导致栈溢出。