一对刚出生的小白兔两个月后就成熟并生下一对小兔子,之后每个月都能生一对小兔子。刚生下的小兔子过两个月以后也成熟了,也能每个月生一对小兔子,……,以此类推。假设兔子永远不会翘辫子,现在给你一对刚出生的小白兔,问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