斐波那契数列是生物、数学和计算机领域(可能还包括计划生育办公室)人士都比较熟悉的一个问题:小明买回来一对兔子,从第3个月开始就每个月生一对兔子,生的每一对兔子长到第3个月也开始每个月都生一对兔子,每一对兔子都是这样从第3个月开始每个月生一对兔子,那么每个月小明家的兔子数量(对)构成一个数列,这就是著名的斐波那契数列。
Python栏目已经发布过关于这个数列的系列文章,详见:
现在的问题是,如果假设每一对兔子的寿命都是72个月,并且只要活着就坚持每个月生一对小兔子。那么任意第n个月的兔子总数是多少呢?
非常好的推算方法和正确的通项公式:
当n=1或n=2时,f(n)=1
当n<72时,f(n)=f(n-1)+f(n-2)
当n=73时,f(n)=f(n-1)+f(n-2)-2
当n>73时,f(n)=f(n-1)+f(n-2)-f(n-72)
具体的数学推导和讨论过程不再赘述,为了从数值上验证通项公式的正确性,我编写了两个程序,通过不同的推算方式来模拟手工推算过程,这是本文的重点。
第一个程序的思路是,每行的数字表示这个月新出生的兔子数量,行的长度表示这些新生兔子存活的月数,这样的话每列数字之和就是这个月的兔子数量(单位:对),如下图所示:
生成上图Excel中数据的程序如下,可以通过调整参数来设置兔子存活的月数。
第二个程序的思路是,以下图为例,每往下一行往右一列表示兔子长大一个月,行数与兔子寿命月数一样多,第n列的数字之和即为该月兔子总数(单位:对)
生成上面Excel文件的Python程序如下,可以通过调整main()函数的参数任意设置兔子从第几个月开始生兔子以及兔子的寿命。
上面的两个程序都是把生成的数据存放到Excel文件中,当数值超过一定大小之后,会进行四舍五入。大家可以按照上面的思路自行改写为使用Python列表保存数据。