递归函数
目录:
- 函数递归调用介绍
- 回溯与递推
1:函数递归调用介绍
函数不仅可以嵌套定义,还可以嵌套调用,即在调用一个函数的过程中,函数内部又调用另一个函数,而函数的递归调用指的是在调用一个函数的过程中又直接或者间接的调用该函数本身。
例如:在调用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对函数的递归调用深度作了限制,不会无限循环,而是抛出异常。
要想避免出现这种情况,就必须在递归调用时设置条件。
#1. 可以使用sys.getrecursionlimit() 查看递归深度,默认1000 # 可以使用sys.setrecursionlimit()去设定该值,但仍受限于主机操作系统栈大小的限制 # 2. python不是一门函数式编程语言,无法对递归进行尾递归优化。
回溯与递推
某公司四个员工坐在一起,问第四个人薪水,他说比第三个人多1000,问第三个人薪水,第他说比第二个人多1000,问第二个人薪水,他说比第一个人多1000,最后第一人说自己每月5000,请问第四个人的薪水是多少?
s(4) = s(3) +1000 s(3) = s(2) +1000 s(2) = s(1) +1000 s(1) = 5000 s(n) = s(n-1) +1000 (n >1) s(1) = 5000 (n = 1)
def salary(n): if n ==1: return 5000 return salary(n-1) +1000 s= salary(4) print(s)
在未满足n==1的条件时,一直进行递归调用,即一直回溯。而在满足n==1的条件时,终止递归调用,即结束回溯,从而进入递推阶段,依次推导直到得到最终的结果。
递归本质就是在做重复的事情,所以理论上递归可以解决的问题循环也都可以解决,只不过在某些情况下,使用递归会更容易实现,比如有一个嵌套多层的列表,要求打印出所有的元素,代码实现如下
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