兔子问题和斐波那契数列:递归程序设计艺术(2)

一对刚出生的小白兔两个月后就成熟并生下一对小兔子,之后每个月都能生一对小兔子。刚生下的小兔子过两个月以后也成熟了,也能每个月生一对小兔子,……,以此类推。假设兔子永远不会翘辫子,现在给你一对刚出生的小白兔,问n个月后有几对兔子?

显然,输入参数是n。递归边界是n=0或1,此时小兔子还没有出生,所以兔子数目都是1对。递归假设是任意n-1,n-2,......个月的兔子数目都是已知的。

当n>2时,每个月的兔子由上个月的兔子和本月新出生的兔子组成。而本月新出生的兔子数与两个月前的兔子总数相同,因为那时即使是刚出生的兔子现在也成熟了,也能在本月生出一对新的小兔子。所以,本题的解就是著名的斐波那契(Fibnacci)数列:F(n) = F(n-1) + F(n-2), F(1) = F(0) = 1。

解决兔子问题的递归程序

def get_rabbits(months):
    if months <= 1:     # 递归边界
        return 1
    # 每个月的兔子数等于上个月兔子数+这个月新增兔子数
    # 而这个月新增兔子数=两个月前的兔子数,因为那时即使刚出生的兔子现在也成熟了
    return get_rabbits(months - 1) + get_rabbits(months - 2)

if __name__ == '__main__':
    for months in range(11):
        print(months, ':%6d' % get_rabbits(months), 'pairs')

运行结果如下:

0 :     1 pairs

1 :     1 pairs

2 :     2 pairs

3 :     3 pairs

4 :     5 pairs

5 :     8 pairs

6 :    13 pairs

7 :    21 pairs

8 :    34 pairs

9 :    55 pairs

10 :    89 pairs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方林博士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值