描述
- 大家都知道斐波那契数列,现在要求输入一个整数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;
}
};