5.1 斐波那契数列

列昂纳多·斐波那契(Leonardo Fibonacci,1170—1250),意大利数学家,他在研究兔子繁殖问题时,发现了斐波那契数列。一般而言,兔子在出生两个月后就有繁殖能力,一对兔子每个月能生出一对小兔子。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?

我们不妨从一对新出生的小兔子开始分析一下:

第一月,兔子刚出生,只有一对兔子;

第二月,小兔子还没有繁殖能力,所以还是一对;

第三月,生下一对小兔,共有两对兔子;

第四月,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对。这样继续画下去我们可以得到图5-1。

图5-1 兔子繁殖示意图

我们把月份、成年兔子对数和幼仔对数放入一张表,依此类推可以列出表5-1。

表5-1 兔子繁殖表

幼仔对数=前月成兔对数

成兔对数=前月成兔对数+前月幼仔对数

总体对数=本月成兔对数+本月幼仔对数

可以看出幼仔对数、成兔对数、总体对数都构成了一个数列。这个数列有个十分明显的特点:前面相邻两项之和构成了后一项。这样我们把兔子对数写下来构成斐波那契数列:

1,1,2,3,5,8,13,21,34,55,89,144,…

如果设an为该数列的第n项(nN*),那么相邻项的关系可以写成如下形式:

an=an-1+an-2

此时,

a1=1,a2=1 an=an-1+an-2 (n≥3,nN*

有了这个公式,我们用程序来产生斐波那契数列的前100项,并把它存在一张表里面,程序如下:

这个程序里面使用了列表这种数据结构,列表是Python中一个重要的数据对象,可以把它看成一个一排编了号的抽屉,抽屉中能存放任何能放得下的东西,可以通过编号访问,可以排序,可以增加。表5-2列出了常用的操作中列表的方法,表中假设已经定义了一个列表L。

表5-2 常用的列表操作方法

人们发现,当n趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618,我们可以试着计算一下:

1÷1=1,

1÷2=0.5,

2÷3=0.666…,

3÷5=0.6,

5÷8=0.625,

……

55÷89=0.617 977…,

144÷233=0.618 025…,

……

46 368÷75 025=0.618 033 988 6…,

……

可以看到,从第11个数开始,已经与黄金分割比的前三位小数一致了。仍然用前面的小程序来核算一下: