斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波那契数列都有直接的应用,美国数学会从1963起专门出版了以《斐波那契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
这个数列从第3项开始,每一项都等于前两项之和。
假设我们编写一小段Python代码来实现斐波那契数列:
'''斐波那契数列'''
fibs = [0,1]
for i in range(8-2):
fibs.append(fibs[-2]+fibs[-1])
print(fibs)
输出结果:
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/习题11.py
[0, 1, 1, 2, 3, 5, 8, 13]
Process finished with exit code 0
当然,如果想得到任意多个数字,可以加入int(input())来设定数字,作为动态范围的长度使用,从而改变for语句块中循环次数:
'''斐波那契数列'''
fibs = [0,1]
n = int(input('请输入一个大于2的整数:'))
for i in range(n-2):
fibs.append(fibs[-2]+fibs[-1])
print(fibs)
输出如下:
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/习题11.py
请输入一个大于2的整数:10
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Process finished with exit code 0
当然,程序员都是一帮很懒的家伙,不是说他们从不做事,而是从来不喜欢做无用功。这次大家得到了10个斐波那契数字,那下一次如果需要二十个,难道他们再把这段代码输入一遍?OK,如果你有耐心可以再输一遍,但是程序员可不会这么干。
程序员会怎么做呢?先定义一个斐波那契数列的函数,以后每次需要用到这个函数的时候,直接调用即可。
比如我们要实现小于5000和500的所有斐波那契数列:
def fibs_1(n):
a,b =0,1
while b < n:
print(b,end='\t')
a,b = b,a+b
def fibs_2(n):
fibs = []
a, b = 0, 1
while b<n:
fibs.append(b)
a, b = b, a + b
print(fibs)
fibs_1(5000)
print()
fibs_2(500)
输出结果如下:
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/习题11.py
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
Process finished with exit code 0
其他方法很有很多,至少有五六种,暂且先介绍这两个,慢慢来,不能一口吃个胖子。
我们开始看看今天的题目:
有趣的兔子(斐波那契数列)
如果每对兔子每月繁殖一对子兔,而子兔在出生后第二个月就有生殖能力,试问一对兔子一年能繁殖多少对兔子?
可以这样思考:第一个月后即第二个月时,1对兔子变成了两对兔子,其中一对是它本身,另一对是它生下的幼兔. 第三个月时两对兔子变成了三对,其中一对是最初的一对,另一对是它刚生下来的幼兔,第三对是幼兔长成的大兔子. 第四个月时,三对兔子变成了五对,第五个月时,五对兔子变成了八对,按此方法推算,第六个月是13对兔子,第七个月是21对兔子„„,裴波那契得到一个数列,人们将这个数列前面加上一项1,成为“裴波那契数列”,即:1,1,2,3,5,8,13„.
思考:
每个月新增的兔子数量实际上是一个斐波拉契数列:
0,1,1,2,3,5…
每个月总的兔子数量也是一个斐波拉契数列:
0,1,1,2,3,5,8,13…
下面个数列每一项减去上面个数量每一项得到的新数列也是斐波拉契数列:
0,1,1,2,3,5,8…
斐波纳契数列:0,1,1,2,3,5,8,13…
这个数列从第3项开始,每一项都等于前两项之和,即:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在许多的学科领域,斐波纳契数列都有直接的应用。
def fibs(n):
a,b = 0,1
for i in range(n-1):
a,b = b,a+b
print(b)
fibs(12)
输出结果为:
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/习题11.py
144
Process finished with exit code 0