牛客網《劍指Offer》(7)斐波那契數列

題目描述

大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項爲0)。n<=39

題目分析

首先理解什麼是斐波那契數列:即f(1) = 1 ,f(2) = 1,f(n) = f(n-1) +f(n-2)

同樣,實現方法也有兩種:1、自底向上實現,2、遞歸實現

方法一:自底向上實現

class Solution {
public:
    int Fibonacci(int n) {
    //f(1) = 1 ,f(2) = 1,f(n) = f(n-1) +f(n-2)
     //自底向上實現
     if(n == 0)
         {
             return 0;
         }
     if(n >0 && n <= 2)
         {
             return 1;
         }
     int f1 = 1;
     int f2 = 1;
     int sum =0;
     for(int i =3;i<=n;i++)  
     {
         sum = f1 + f2;
         f1 = f2;
         f2 = sum;
         
     }
        return sum;
    }
};

方法二:遞歸實現

class Solution {
public:
    int Fibonacci(int n) {   
    //遞歸實現    
     if (n == 0)
         return 0;
     else if(0 < n && n<=2 )
         return 1;
     else
     {
             return Fibonacci(n-1) + Fibonacci(n-2);
     }
                  
   }
};

仔細分析一下,上面遞歸實現的流程:

求f(n)時需要計算f(n-1)與f(n-2),求f(n-1)時需要計算f(n-2)與f(n-3),是不是f(n-2)重複計算了一次,同理,後續所有元素都有重複計算,繼續優化一下。

備忘錄法:巧用數組下標實現狀態保存。

1、創建備忘錄數組result,並全部初始化爲0。

2、每次計算f(n)前先查詢數組,若爲0,則遞歸計算並將計算結果存入result[n]。

class Solution {
public:
    int result[40] = {0};
    int Fibonacci(int n) {   
    //遞歸實現    
     if (n == 0)
         return 0;
     else if(0 < n && n<=2 )
         return 1;
     else
     {
        if(result[n] != 0)
             //return result[n];
         else
        {
             result[n] = Fibonacci(n-1) + Fibonacci(n-2);
             return result[n];
         }            
     }      
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章