1. 程式人生 > >面試題10:斐波那契數列

面試題10:斐波那契數列

區別 原創文章 時間 -c 通過 res border cci rgb

斐波那契數指的是這樣一個數列:0、1、1、2、3、5、8、13、21、……
這個數列從第三個數開始,之後的每一個數都由它前的兩數相加得到。

我們知道在編程中我們可以用遞歸和叠代兩種方法求指定的斐波那契數,但這兩種方法各有利弊。

區別:遞歸法(時間復雜度O(2^n))寫出來的代碼可讀性強,就相當於把書上的數學公式 翻譯成代碼,但這種方法效率太慢了,當你求第50個斐波那契數,你的電腦可能得運算十多分鐘。而且遞歸很容易造成棧溢出,每調用一次函數就得開辟一塊空間,而求第50個斐波那契數所調用函數的次數是令人發指,同樣的那在棧上開辟的空間大小也就可想而知,棧溢出就很正常了。

叠代法:(時間復雜度O(N))相對而言叠代法的運算效率就高的多了,叠代是通過循環來求的,只要創建3個臨時變量,就能很快的求出斐波那契數,而且速度快的一匹(那怕求第100斐波那契數也只是一瞬間的事),但叠代法的代碼可讀性較弱,而且初學者也不容易寫出這種代碼。
---------------------
作者:Tianzez
來源:CSDN
原文:https://blog.csdn.net/tianzez/article/details/78443321
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

下面是代碼:

  • 遞歸法
int Fab(int n){
    
      if(n == 0)
         return 0;
      if(n == 1)
         return 1;

      return Fab(n-1) + Fab(n-2);

}


  • 叠代法
long long Fibnacci(unsigned n){
    
    int result[2] = {0,1};
    if(n < 2)
        return result[n];

    long long fibNMinusOne = 0;
    long long fibNMinusTwo = 1
; long long fibN = 0; for(int i = 2;i <= n;i++){ fibN = fibNMinusOne + fibNMinusTwo; fibNMinusOne = fibNMinusTwo; fibNMinusTwo = fibN; } }

面試題10:斐波那契數列