chapter4.4递归

Posted rprp789

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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())

递归深度查询时显示的值,是最大值,在运行一个没有边界的递归函数时,可以看到最多的递归次数并没有到达最大,这是因为函数的调用在开启编译器的时候就开启了很多基础函数。我们在这些函数基础上进行编辑。

间接递归:注意函数的互相调用,在项目较大时出现很难判断位置。要规范代码。

 递归总结

递归是一种很自然的表达,符合逻辑思维

递归相对运行效率低,每一次的调用都要开辟新的栈帧

递归有深度限制,如果递归深度太深,函数反复压栈,栈内存会溢出

有次数的递归,可以使用,或者循环代替,

绝大多数递归,可以循环实现,

即使递归代码简短,能不用就不用递归

 

以上是关于chapter4.4递归的主要内容,如果未能解决你的问题,请参考以下文章

CSP核心代码片段记录

executePendingTransactions 的递归入口

nodejs常用代码片段

JavaScript 代码片段

48个值得掌握的JavaScript代码片段(上)

哈斯克尔。我很困惑这个代码片段是如何工作的