题目
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
思路
这个题比较容易,多练了几个。
递归(超时,重复计算太多)
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)前保存这个计算好的值,然后继续递归返回。
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(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;
}
};
来源:CSDN
作者:PandaDou
链接:https://blog.csdn.net/m0_37822685/article/details/104158791