斐波那契数列(Fibonacci sequence),又称黄金分割数列,以兔子繁殖为例子而引入,每对兔子每月繁殖一对子兔,而子兔在出生后第二个月就有生殖能力,试问一对兔子一年能繁殖多少对兔子?可以这样思考:第一个月后即第二个月时,1对兔子变成了两对兔子,其中一对是它本身,另一对是它生下的幼兔. 第三个月时两对兔子变成了三对,其中一对是最初的一对,另一对是它刚生下来的幼兔,第三对是幼兔长成的大兔子. 第四个月时,三对兔子变成了五对,第五个月时,五对兔子变成了八对,按此方法推算,第六个月是13对兔子,第七个月是21对兔子„„,裴波那契得到一个数列,人们将这个数列前面加上一项1,成为“裴波那契数列”,即0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:
F(0)=0, 第0月表示没有兔子
F(1)=1,第1月表示只有原始的1对兔子,兔子还没有生育能力
F(2)=1,第2月表示只有原始的1对兔子,兔子还没有生育能力,第3个月生育一对兔子
F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N)
可以使用树形结构来描述,其中最左边的数表示月份,白色的圈表示未成熟的兔子,黑色的圆表示已经成熟,可以生育的兔子。
观察发现,每月已经成熟的兔子数量等于上个月的兔子数量,这是因为一对兔子过了一个月就会成熟,而已经成熟的兔子过了一个月还是成熟的。这样,因为每一对成熟的兔子在下一个月都会生出一对兔子,所以每月兔子增加的数量就是两个月前兔子的数量,这样把每个月兔子的数量排成一个数列,正好是著名的“斐波那契数列”
第一种:递归方式实现斐波那契数据
int fib(int n){
if(n==0)
{
return 0;
}
if(n <= 2)
{
return 1;
}else
{
return fib(n-1) +fib(n-2);
}
}
第二种方式是使用数组来实现斐波那契数列,因为数组的特性和斐波那契数列相似,我们可以创建一个数组,里面存的的是数组的角标,然后根据斐波那契数列的特点,更新数组
if(n == 0)
{
return 0;
}
if(n == 1){
return 1;
}
int a[n+1];
a[0] = 0;
a[1] = 1;
for(int i = 2;i < n+1;i++)
{
a[i] = a[i-1]+ a[i-2];
// a[i]=a[i]%1000000007;注释掉之后测试45会出错,放开成功,原因如下
}
return a[n];
}
当n很大的时候可能会出现数字溢出,所以我们需要用结果对1000000007求余,但实际上可能还没有执行到最后一步就已经溢出了,所以我们需要对每一步的计算都要对1000000007求余
参考:https://www.pianshen.com/article/228918530/