7.斐波那契数列

若如初见. 提交于 2020-02-03 21:25:27

题目

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39

思路

这个题比较容易,多练了几个。
F(n)=F(n1)+F(n2),n>=2F(n) = F(n-1)+F(n-2), n >=2
F(1)=1,F(0)=0F(1) = 1, F(0) = 0

递归(超时,重复计算太多)

class Solution {
public:
    int Fibonacci(int n) {
        if ( n == 0 || n == 1 ) return 1;
         
        int res = 0;
        res += Fibonacci(n-1) + Fibonacci(n-2);
         
        return res;
    }
};

递归记忆化搜索

用个memo数组保存一下计算过的值。因为递归实际上就是利用栈,当递归到n=0 或 1时才会返回,此时f(2)=f(1)+f(0)f(2)=f(1)+f(0),在返回f(2)前保存这个计算好的值,然后继续递归返回。

class Solution {
private:
    vector<int> memo;
public:
    int FibonacciCore( int n ) {
        if ( memo[n] != -1 ) return memo[n];
         
        int res = 0;
        res += FibonacciCore(n-1) + FibonacciCore(n-2);
         
        memo[n] = res;
         
        return res;
    }
     
    int Fibonacci(int n) {
        memo= vector<int>(n+1, -1);
        memo[0] = 0; memo[1] = 1;
         
        return FibonacciCore( n );
    }
};

动态规划

把递归的改为不递归的,用memo保存算过的。递归是从n到0到1时开始逐层返回。非递归直接从0,1之后开始计算。

class Solution {
public:
    int Fibonacci(int n) {
        vector<int> memo(n+1, 0);
        memo[1] = 1;
         
        for ( int i = 2; i <= n; ++i ) {
            memo[i] = memo[i-1] + memo[i-2];
        }
         
        return dp[n];
    }
};

动态规划优化

公式是F(n)=F(n1)+F(n2)F(n) = F(n-1)+F(n-2),不必创建一个数组,只需要创建两个变量保存上一轮计算的结果就行了。
在计算下一轮的时候:
原来的f(n)就变成了这一轮的f(n-1)
原来的f(n-1)就变成了这一轮的f(n-2)

class Solution {
public:
    int Fibonacci(int n) {
        if ( n == 0 ) return 0;
        if ( n == 1 ) return 1;
         
        int fibNMinusOne = 1;
        int fibNMinusTwo = 0;
        int fibN = 0;
         
        for ( int i = 2; i <= n; ++i ) {
            fibN = fibNMinusOne + fibNMinusTwo;
             
            fibNMinusTwo = fibNMinusOne;
            fibNMinusOne = fibN;
        }
         
        return fibN;
    }
};
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!