【算法】数学中的斐波那契数列

数学中有一种数列称为 斐波那契数列(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)(≥ 2,∈ 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; 

     
     

}

 

posted on 2023-02-16 10:01  新西兰程序员  阅读(105)  评论(0编辑  收藏  举报