18、Python之函数递归

Python函数 / 2020-12-01

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
世间微尘里 独爱茶酒中