chapter4.4、递归
递归
函数间接或直接调用函数自身就是递归
递归要有边界条件,递归前进段,递归返回段
递归一定要有边界条件,
边界条件不满足,递归前进,
满足边界条件,递归返回
斐波那契数列的递归实现
def fib(n): return 1 if n < 3 else fib(n-1) + fib(n-2)
这种调用方式效率极低,每一次的计算都没有用到前一次计算出的值
可以改写为
def fib3(n,a=0,b=1): a,b = b,a+b if n==1: return a return fib3(n-1,a,b) fib3(6)
以上方式每次计算可以用到上次的结果,n是边界,思想和for循环相似,效率与for循环相似,单受到递归深度的限制。
递归一定要有退出条件,没有退出条件的递归调用,就是无限调用
递归调用的深度不宜过深
python对的递归的调用深度做了限制,以保护解释器
超过递归深度的限制,会抛出RecursionError:maximum recursion depth exceeded in comparison 超出最大深度。
查询当前的最大递归深度
import sys print(sys.getrecursionlimit())
递归深度查询时显示的值,是最大值,在运行一个没有边界的递归函数时,可以看到最多的递归次数并没有到达最大,这是因为函数的调用在开启编译器的时候就开启了很多基础函数。我们在这些函数基础上进行编辑。
间接递归:注意函数的互相调用,在项目较大时出现很难判断位置。要规范代码。
递归总结
递归是一种很自然的表达,符合逻辑思维
递归相对运行效率低,每一次的调用都要开辟新的栈帧
递归有深度限制,如果递归深度太深,函数反复压栈,栈内存会溢出
有次数的递归,可以使用,或者循环代替,
绝大多数递归,可以循环实现,
即使递归代码简短,能不用就不用递归