zoukankan      html  css  js  c++  java
  • 递归

    递归

    一、什么是递归

    函数的嵌套调用是:函数嵌套函数。函数的递归调用:它是一种特殊的嵌套调用,但是它在调用一个函数的过程中,又直接或间接地调用了它自身,并且要又退出函数的条件(递归: 函数A调用函数A)。

    def foo():
        print('from foo')
        foo()
    
    foo()  # 进入死循环
    

    如果递归函数不断地调用函数自身,那么这个递归函数将会进入一个死循环,因此我们应该给递归函数一个明确的结束条件。

    递归必须要有两个明确的阶段:

    1. 递推:一层一层递归调用下去,进入下一层递归的问题规模都将会减小
    2. 回溯:递归必须要有一个明确的结束条件,在满足该条件开始一层一层回溯。

    递归的精髓在于通过不断地重复逼近一个最终的结果。

    53递归-代码.gif

    二、递归使用

    求解年龄

    6/18/20/22/24

    后面一个人的年龄比前一个年龄多两岁,求第n个人的年龄

    # 递归的核心:递进的时候能够达到一个结果,问题规模越来越小(不一定要真正的达到)并且要设置一个条件,能够让最后一次函数调用结束
    
    '''
    age_func(5) --> return age_func(4)+2 == 24+2 =26
    age_func(4) --> return age_func(3)+2 == 22+2 = 24
    age_func(3) --> return age_func(2)+2 == 20+2 = 22
    age_func(2) --> return age_func(1)+2 == 18+2 = 20
    age_func(1) --> return age_func(0)+2  == 16+2= 18
    '''
    
    age = 16
    
    
    def age_func(n):
        global age
        if n == 0:
            return age
    
        return age_func(n - 1) + 2
    
    
    res = age_func(6)
    print(res)
    

    三、总结

    python中的递归
    python中的递归效率低,需要在进入下一次递归时保留当前的状态,在其他语言中可以有解决方法:尾递归优化,即在函数的最后一步(而非最后一行)调用自己,尾递归优化但是python又没有尾递归,且对递归层级做了限制

    总结递归的使用:

    1. 必须有一个明确的结束条件

    2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

    3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    ubuntu12.04 安装配置jdk1.7
    Ubuntu下解决bash 没有那个文件或目录的方法
    Mongodb集群搭建的三种方式
    AngularJS 中文资料+工具+库+Demo 大搜集
    Android 反编译apk 详解
    Node.js 开发模式(设计模式)
    Comet:基于 HTTP 长连接的“服务器推”技术
    基于NodeJS的全栈式开发
    node.js应用Redis数据库
    Hibernate(二):MySQL server version for the right syntax to use near 'type=InnoDB' at line x
  • 原文地址:https://www.cnblogs.com/randysun/p/11352790.html
Copyright © 2011-2022 走看看