zoukankan      html  css  js  c++  java
  • 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())

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

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

     递归总结

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

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

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

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

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

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

  • 相关阅读:
    DataAdapter的Fill方法(转)
    C#读取xml节点数据方法小结
    Service-Oriented Architecture,SOA(转)
    SOAP详解(转)
    WebService到底是什么?(转)
    只需要2个工具,百度云盘大文件就能用迅雷和IDM下载
    刘铁猛-深入浅出WPF-系列资源汇总
    WCF书籍
    书籍:wpf学习书籍介绍
    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器(转)
  • 原文地址:https://www.cnblogs.com/rprp789/p/9532364.html
Copyright © 2011-2022 走看看