函数递归
函数递归
函数递归值的是重复“直接或间接调用”函数本身,这是一种函数嵌套调用的表现形式
直接调用:指的是在函数内置,直接调用函数本身
特点:
1.直接或者间接调用自身 2.具有结束条件,防止递归外溢 3.代码规模逐渐减少
#在调用f1的过程中,又调用f1,这就是直接调用函数f1本身
def f1():
print('from f1')
f1()
f1()
间接调用:两个函数之间相互调用间接造成递归
#在调用f1的过程中,又调用f2,而在调用f2的过程中又调用f1,这就是间接调用函数f1本身
def f1():
print('from f1')
f2()
def f2():
print('from f2')
f1()
f1()
上面可以看到两种无限循环的过程,所以python中设置有递归默认深度(998/1000)目的为了限制递归次数
#了解
#1. 可以使用sys.getrecursionlimit()去查看递归深度,默认值为1000,虽然可以使用sys.setrecursionlimit()去设定该值,但仍受限于主机操作系统栈大小的限制
#2. python不是一门函数式编程语言,无法对递归进行尾递归优化。
回溯与递推
想要递归有意义,必须遵循两个条件:
回溯:
当遇到终止条件,则从最后往回一级一级的把值返回来
递推:
递归每一次都是基于上一次进行下一次的执行
def salary(n):
if n == 1:
return 5000
return salary(n - 1) +1000
s=salary(4)
print(s)
#解析
当传入的实参为4时,函数体代码中的if判断语句不成立,所以直接返回salary(3)+1000
然后依次类推,整个过程如下
salary(4)=salary(3)+1000
salary(3)=salary(2)+1000
salary(2)=salary(1)+1000
salary(1)=5000
#递归本质就是在做重复的事情,所以理论上递归可以解决的问题循环也都可以解决,只不过在某些情况下,使用递归会更容易实现,比如有一个嵌套多层的列表,要求打印出所有的元素,代码实现如下
items=[[1,2],3,[4,[5,[6,7]]]]
def foo(items):
for i in items:
if isinstance(i,list): #满足未遍历完items以及if判断成立的条件时,一直进行递归调用
foo(i)
else:
print(i,end=' ')
foo(items)
#结果为
1 2 3 4 5 6 7
作者:池木
出处:https://home.cnblogs.com/u/a736659557/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。