递归函数
什么递归函数?
递归函数就是直接或者间接调用自身,递归的本质是循环,递归能解决的问题循环也能解决。
递归的间隔阶段:
- 回溯:一层一层往下嵌套,也就是不断的调用自身,只到触发结束条件;
- 递推:当触发结束条件时,一层一层往回推。
# 直接调用自己
def func():
print("直接调用自身")
func()
func()
# 间接调用自己
def func1():
print("间接调用自己")
func2()
def func2():
func1()
func1()
像上面的两种递归情况都会形成死循环,并且每一次调用自己都会开辟一个局部名称空间,递归函数是自身套自身第一次调用等待第二次调用结束才会结束、第二次调用等第三次调用结束、第三次调用等待第四次调用结束。。。这样就会导致前面的调用永远不会结束,也就是前面开辟的名称空间也永远不会关闭,这样由于调用次数达到相当大是会发生内存崩溃导致电脑卡死,使用python是、系统设置了一个递归深度,当递归次数等于递归深度时报错(RecursionError: maximum recursion depth exceeded while calling a Python object)结束这次递归调用。因此一般写递归函数都应该包含结束条件。
获取递归深度和改变递归深度
import sys
# 用getrecursionlimit回去递归深度
print(sys.getrecursionlimit())
# 用 setrecursionlimit更改递归深度,不建议更改
sys.setrecursionlimit(1001)
递归小例:
打印列表中的元素:
例:l = [1,2,[2,3,[3,4,[4,5,[5,6,[6,7,[7,8,[8,9,[9,10]]]]]]]]]
打印结果:1,2,2,3,4,4,5,5,6,6,7,7,8,8,9,9,10
l = [1,2,[2,3,[3,4,[4,5,[5,6,[6,7,[7,8,[8,9,[9,10]]]]]]]]]
def func(list1):
for i in list1:
if isinstance(i,list):
func(i)
else:
print(i,end='\t')
func(l) # 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10