zoukankan      html  css  js  c++  java
  • python递归

    递归概念:(百度了一下,看看就懂了)

    用数学代入法来理解就好。

    假设我们用递归来算阶乘 f(n)

    f = n =>
        n === 1 ? 1
                : n * f(n-1) 
    

     f 里面用到了 f,怎么理解呢?

    很简单,把式子展开即可:

     f(6)

    => 6 * f(5)

    => 6 * (5 * f(4))

    => 6 * (5 * (4 * f(3)))

    => 6 * (5 * (4 * (3 * f(2))))

    => 6 * (5 * (4 * (3 * (2 * f(1)))))

    => 6 * (5 * (4 * (3 * (2 * 1))))

    => 6 * (5 * (4 * (3 * 2)))

    => 6 * (5 * (4 * 6))

    => 6 * (5 * 24)

    => 6 * 120

    => 720

     看到递归了吗?

    先递进,再回归——这就是「递归」。

    以上是 SICP 原文(有删改)。

    看完可能有点意思了,那看一下典型的题:

    使用递归实现:计算某个数的阶乘

    def num_1(num1):
        if num1 == 1:
            return num1
        num1 = num1*num_1(num1-1)
        return num1
    # print(num_1(5))

     斐波那契数

    def num_2(num2):
        if num2 <= 2:
            return 1
        return num_2(num2-1)+num_2(num2-2)
    
    # print(num_2(9))
    

      

    # 1.兔子繁殖问题。

    # 设有一对新生的兔子,从第4个月开始他们每个月月初都生一对新兔子,

    # 新生的兔子从第4个月开始又每个月月初生一对兔子。

    # 按此规律,并假定兔子没有死亡,20个月末共有多少对兔子?

    def num_4(num4):
        if num4 < 4:
            return 1
        return num_4(num4-1)+num_4(num4-3)
    
    #print(num_4(20))
    

      

    递归是很消耗堆栈资源的,递归次数太多了肯定会溢出内的。确切地说,是函容数调用本身就会消耗堆栈资源,不过函数调用结束的时候这个函数使用的堆栈空间会被返还,所以问题不大,很少能看到程序栈满的情况。但是递归是个例外,它是一个函数循环调用自身的过程,在递归结束之前,堆栈使用量会一直增长。程序会不会溢出,就看在栈满之前,你的递归函数能否返回····

    耐得住寂寞,守得住繁华
  • 相关阅读:
    如何在SQL/400中计算两日期间的天数
    委托、事件与Observer设计模式
    C# 杂项
    泛型学习(二)
    委托
    操作符重载 (operator)
    一个解决方案多个项目
    将方法绑定到委托
    事件
    密封方法 密封类(sealed)
  • 原文地址:https://www.cnblogs.com/yunzhongjunlang/p/13969031.html
Copyright © 2011-2022 走看看