演算法學習記錄六(C++)--->獲取斐波那契數列第n項

Deft_MKJing宓珂璟發表於2017-08-03

描述

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

分析

這東西第一眼想到的就是遞迴,但是遞迴就會有問題,請看;
f(n) = f(n-1) + f(n-2)
隨便弄個簡單的數字,其實你拆開來就會這樣
Fibonacci(4) = Fibonacci(3) + Fibonacci(2);
= Fibonacci(2) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
= Fibonacci(1) + Fibonacci(0) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);

很明顯,重複計算了

int Fibonacci(int n)
    {
        if(n <= 1)
        {
            return n;
        }
        else
        {
            return Fibonacci(n - 1) + Fibonacci(n - 2);
        }
    }

而且這種n一大,直接棧溢位

解法一


class Solution {
public:
    int Fibonacci(int n) {
        // 非常容易理解,0,1,2的時候單獨處理
        if(n <= 0){
            return 0;
        }
        if(n == 1 || n ==2){
            return 1;
        }
        int a = 1;
        int b = 1;
        int result;
        // 然後處理的時候獲取到A+B的結果,然後把B賦值給A,結果賦值給B,一步步忘後面移動
        for(int i = 3;i<=n;i++){
            result = a + b;
            a = b;
            b = result;
        }
        return result;
    }
};

解法二

class Solution {
public:
    // 動態規劃版本 總之核心就是先獲取兩者相加的結果,然後再把結果減去A值,得到B值
    int Fibonacci(int n) {
        int i = 0;
        int j = 1;
        while(n--){
            j += i;
            i = j - i;
        }
        return i;
    }
};

相關文章