20 递归算法实操

奇妙的想法更需要反复练习

大纲

  • 练习:斐波那契数列

  • 练习:青蛙跳台阶

  • 练习:兔子繁殖问题

练习:斐波那契数列

斐波那契数列是指这项数字等于前面两项数字之和的序列

1、1、2、3、5、8、13、21、34、……

让我们用递归算法来实现一下,如何计算出数列的第N项

def fibonacci(n):
    if n<= 2:
        return 1     # 停止条件
    else:
        return fibonacci(n-1)+fibonacci(n-2)  # 分拆

fibonacci(8)
21
for x in range(1,10):
    print(fibonacci(x))
1
1
2
3
5
8
13
21
34

如果要算出所有的数字,可以直接用列表解析。

[fibonacci(x) for x in range(1,10)]
[1, 1, 2, 3, 5, 8, 13, 21, 34]

练习:青蛙跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

每次跳的时候,小青蛙可以跳一个台阶,也可以跳两个台阶,也就是说,每次跳的时候,小青蛙有两种跳法。第一种跳法:第一次我跳了一个台阶,那么还剩下n-1个台阶还没跳,剩下的n-1个台阶的跳法有f(n-1)种。第二种跳法:第一次跳了两个台阶,那么还剩下n-2个台阶还没,剩下的n-2个台阶的跳法有f(n-2)种。所以,小青蛙的全部跳法就是这两种跳法之和了,即 f(n) = f(n-1) + f(n-2)。

def taijie(n):
    if n<= 2:
        return n     # 停止条件
    else:
        return taijie(n-1)+taijie(n-2)  # 分拆

taijie(8)
34

练习:兔子繁殖问题

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

第n月的时候的兔子包括两种,一种是当前新生的兔子,另一种是以前的老兔子,新兔子的数量等于两个月前的老兔子数量,以前的老兔子数量就是一个月前的老兔子数量,所以F(n) = F(n-1)+F(n-2)

def tuzi(n):
    if n<= 2:
        return 2     # 停止条件
    else:
        return tuzi(n-1)+tuzi(n-2)  # 分拆

tuzi(8)
42
[tuzi(x) for x in range(1,12)]
[2, 2, 4, 6, 10, 16, 26, 42, 68, 110, 178]

假设兔子寿命是8个月,1月出生的兔子到了9月就会死亡,那么上面这个问题里,到了两年后兔子总数会是多少?

第n月的时候的兔子数量除了新兔子和老兔子,还要考虑8个月前的兔子,所以F(n) = F(n-1)+F(n-2)-F(n-8)

def tuzi(n):
    if n<= 2:
        return 2     # 停止条件
    else:
        if n<=8:
            return tuzi(n-1)+tuzi(n-2) # 分拆
        else:
            return tuzi(n-1)+tuzi(n-2)-tuzi(n-8)
[tuzi(x) for x in range(1,12)]
[2, 2, 4, 6, 10, 16, 26, 42, 66, 106, 168]
tuzi(24)
70040

Last updated

Was this helpful?