1、何为函数递归?
函数递归属于函数嵌套调用的一种特殊形式,特殊在当调用一个函数时直接或间接地调用到本身,即俗称的死循环!
2、为何用它?
当一段代码需要多次循环嵌套时,递归比for、while循环更适合!
3、如何用它?
展示前先思考一个问题,既然是死循环,应不应该让它无限循环下去?当然不应该了!内存会直接被拉爆!因此Python对函数递归的层数有限制,默认是1000层!
3.1、查看递归层数配置
import sys
print(sys.getrecursionlimit())
# 执行得到结果
1000
3.2、直接调用函数本身
递归达到了预设值1000而被终止
# 直接调用本身
def print_str():
print('我是递归')
print_str()
print_str()
# 执行得到结果
我是递归
我是递归
我是递归
我是递归
......
RecursionError: maximum recursion depth exceeded while calling a Python object
3.3、间接调用函数本身
def print_str():
print('我是递归')
recursion()
def recursion():
print_str()
print_str()
# 执行得到结果
我是递归
我是递归
......
RecursionError: maximum recursion depth exceeded while calling a Python object
4、递归的两个阶段
上面说到递归是死循环不能让它无限下去,但是光靠Python的递归层级限制这种约束又显得太过宽松,我们需要给递归加上条件,当满足某种条件时结束递归调用,就跟while一样!因此,我们先来了解下Python递归两个阶段是什么!
4.1、回溯:
回溯就是递归调用一层一层地调下去
4.2、递推:
当满足某种结束条件后,结束递归调用,开始反向一层一层地结束调用
4.3、递归的应用
一段代码需要循环多次嵌套时,递归有时候比for、while循环更适合!来个稍微复杂一点的,取出下列神经病的列表中的每个值!
l2 = [33, 22, [66, [4, [99, [43, [75, [83, [92, 101, 131, [192, [130, ]]]]]]]]]]
def recursion(a):
for i in a:
if type(i) is list: #判断迭代出来的值的类型是否为列表
recursion(i) #是则再次迭代取值嵌套的列表
else:
print(i)
recursion(l2)
# 执行得到结果
33
22
66
4
99
43
75
83
92
101
131
192
130
Process finished with exit code 0