【算法】数学中的斐波那契数列
数学中有一种数列称为 斐波那契数列(Fibonacci sequence), 又称为 黄金分割数列, 因数学家莱昂纳多·斐波那契(Leonardo 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*) => 可以看出,斐波那契数列是一个线性递推数列
斐波那契数列指的是这样一个数列:
0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711……
这个数列的规律是: 从这个数列的第3项开始,每一项都等于前面2项之和
那么,在代码中如何来实现这个数列呢 ==》有2个方法,从它的规律可以看出,最简单直接的显然是递归方法, 但是递归方法的效率低 , 尤其是n比较大时,递归的效率是非常非常差的,比如n=100时,估计计算机需要计算个10分钟左右,其时间复杂度是O(2^n) => 也就是说随着n的增加,时间复杂度呈指数级别增长, 因为我们发现在递归的过程中,我们在不断重复计算 f(n-1)和 f(n-2)的值, 即计算数列中的某个数,都会从1开始重新一步一步这样递归计算,这样的效率肯定会很慢
第一种方法: 递归的代码如下
public int Fibonacci(n) {
if(n == 0)
return 0;
if(n == 1 || n==2)
return 1; if(n > 2) return Fibonacci(n-1) + Fibonacci(n-2); }
第二种方法: 迭代实现 => 推荐使用迭代实现的方式,这样的效率要高很多
public int Fibonacci(n) { if(n == 0) return 0; if(n == 1 || n==2) return 1; int left =1, right =1, sum = 0; //定义初始值 // 我们用一个for循环, left、right分别为前两项,sum为前面2项之和,然后进行交换,把right赋给新的left,sum赋给新的right,得到新的sum值 for(int i = 3; i <= n; i++) { sum = left + right; left = right; right = sum; } return sum; }