目录
兔子问题
1.1.问题描述
1.2.问题分析
1.3.解决实现
斐波那契在计算之书中,提出了一个有趣的兔子问题:
若一对成年兔子每个月恰好生下一对小兔子,一雌一雄,在年初时只有一对小兔子,在第一个月结束时,他们成长为成年兔子,并且第二个月结束时,这对成年兔子将生下一对小兔子,这种成长与繁殖的过程会一直持续下去,并假设生下的小兔子不会死,那么一年之后共可有多少对兔子?
第一个月 1对幼兔
第二个月 1对成兔
第三个月 1对成兔--->1对幼兔
第四个月 1对成兔--->1对幼兔
1对成兔
第五个月 1对成兔--->1对幼兔
1对成兔---->1对幼兔
1对成兔
第六个月 1对成兔---->1对幼兔
1对成兔---->1对幼兔
1对成兔---->1对幼兔
1对成兔
1对成兔
我们可以发现,这形成了一个序列:1,1,2,3,5,8,13,21……
然后现在我们把每个月都可以列出来:
月份 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
只数 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | 89 | 144 |
可以得出结论,一年后有144只兔子
我们把这种:f(n)=f(n-1)+f(n-2) 称为斐波那契数列
我们可以把最后两位数取出来:89/144 55/89 34/55 …… 得出的结果都约等于0.618=黄金分割比,所以斐波那契数列又称为黄金分割数列
使用递归函数方法解决:
def fibo(n):
if n == 0:
return 0
if n == 1:
return 1
return fibo(n-1)+fibo(n-2)
#使用for循环打印出1-12月有多少对兔子
for i in range(1,13):
print('第{}个月,有{}对兔子'.format(i,fibo(i))) #format格式化字符串的方法
>>>第1个月,有1对兔子
第2个月,有1对兔子
第3个月,有2对兔子
第4个月,有3对兔子
第5个月,有5对兔子
第6个月,有8对兔子
第7个月,有13对兔子
第8个月,有21对兔子
第9个月,有34对兔子
第10个月,有55对兔子
第11个月,有89对兔子
第12个月,有144对兔子
使用while循环放在一个列表里:(不使用递归)
def fibo(n):
global fibo_list
fibo_list=[0,1]
i=2
while i<=n:
fibo_list.append(0) #先增加一个元素,不然下一句代码会提示下标越界
fibo_list[i]=fibo_list[i-1]+fibo_list[i-2]
i+=1
return fibo_list
print(fibo(12))
>>>[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]