斐波那契数列的一个典型应用就是兔子繁殖问题。
一.最朴素的兔子繁殖问题就是:有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?
这个问题就是斐波那契数列的直接应用。设f【n】表示第n个月所有的兔子总数。f【1】=1,f【2】=1,f【n】=f【n-1】+f【n-2】.感觉书上讲的并不直观,个人理解如下:第n个月的兔子总数来源于两个方面,一是第n-1个月原来就有的兔子总数,即f【n-1】,二是新出生的兔子总数。由于新出生的兔子在出生的那一月的下一个月的再下一个月开始每个月生新兔子,我们可以假设兔子分为小兔子,中兔子和大兔子,小兔子过一月变为中兔子,中兔子过一月变为大兔子,大兔子每个月生小兔子。我们要算第n个月所有的新出生的小兔子的个数,也就是第n月所有的大兔子总数,这个个数等于第n-1个月所有中兔子和大兔子的总数(因为第n-1个月的中和大兔子第n个月长成了大兔子,第n个月的小兔子完全来源于第n-1个月的中和大兔子),同理,第n-1月所有的中和大兔子又完全来源于第n-2月所有的小,中和大兔子,即第n-2月的所有兔子,即f【n-2】。故f【n】=f【n-1】+f【n-2】.仔细理解这个完全来源,这是递推的核心。按照这个思路,自己按照需要设好前两项,不必要必须第一个月是一个小兔子,什么都可以,只要设好前两项,按照这个思路递推就可以了。
下面来看一个变式----母牛的故事(hdu2018)
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
这道题思路和上一道完全一样,只是递推式不一样了。考虑第n月所有母牛个数,分为两部分:一是上一月已有的所有母牛,即f【n-1】,二是第n月新出生的母牛。假设母牛有1,2,3,4......岁,每月加一岁,4岁开始可以生小母牛(教官教的歇后语:小母牛对屁股--比较牛逼 和 小母牛坐火箭--牛逼冲天),第n月新出生的母牛为1岁母牛,个数等于第n月4岁及以上母牛总数,数目等于第n-1月3岁及以上的母牛,等于n-2月2岁及以上的母牛,等于n-3月1岁即以上的母牛,即n-3月所有母牛f【n-3】.故f【n】=f【n-1】+f【n-3】,只要按需设置好前3项即可。
还有一种是关于兔子可以死亡的问题,对于这个问题,思想还是一样的,但要用一列向量来记录一年中每个年龄的兔子个数,借助矩阵快速幂来求解。