• python 递归


    递归

    在函数内调用函数自身,那我们称之为递归函数。

    日常生活中的递归

    问题:有5个人,问第5个人年龄,他说他比第4个人大2岁;问第4个人年龄,他说他比第3个人大2岁;问第3个人年龄,他说他比第2个人大2岁;问第2个人年龄,他说他比第1个人大2岁;问第1个人年龄,他说他18岁。求第1个人年龄是多少?
    分析:
    第5人比第4人大2岁:age(5)=age(4)+2
    第4人比第3人大2岁:age(4)=age(3)+2
    第3人比第2人大2岁:age(3)=age(2)+2
    第2人比第1人大2岁:age(2)=age(1)+2
    第1人年龄:age(1)=18

    换成函数表示:
    n=1 : age(n)=18
    n>1 : age(n)=age(n-1)+2

    def age(n):
        if n==1:
            return 18
        return age(n-1)+2
    
    print(age(5))
    

    结果:

    26
    

    那么在计算机,又是如何调用的呢?
    age(5)
    age(4)+2
    (age(3)+2)+2
    ((age(2)+2)+2)+2
    (((age(1)+2)+2)+2)+2
    (((18+2)+2)+2)+2
    ((20+2)+2)+2
    (22+2)+2
    24+2
    26

    递归的特性

    1. 必须有一个明确的结束条件。
    2. 每进入更深一层的递归,问题的规模比上一次递归都应有所减少。
    3. 递归效率不高,递归层数过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

    可以通过sys模块的sys.setrecursionlimit()来设置递归的层数。但也必须内存允许,不然即使设置在大,还没到那么多的层数就内存不够了。

    堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html

    尾递归优化:http://egon09.blog.51cto.com/9161406/1842475

  • 相关阅读:
    MongoDB 释放磁盘空间 db.runCommand({repairDatabase: 1 })
    RK 调试笔记
    RK Android7.1 拨号
    RK Android7.1 移植gt9271 TP偏移
    RK Android7.1 定制化 itvbox 盒子Launcher
    RK Android7.1 双屏显示旋转方向
    RK Android7.1 设置 内存条作假
    RK Android7.1 设置 蓝牙 已断开连接
    RK Android7.1 进入Camera2 亮度会增加
    RK 3128 调触摸屏 TP GT9XX
  • 原文地址:https://www.cnblogs.com/yangzhenwei123/p/6759263.html
Copyright © 2020-2023  润新知