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))

 

  

 

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

 

posted @ 2020-11-13 14:03  全村的唯一希望  阅读(181)  评论(0编辑  收藏  举报