斐波那契数列
时间限制:1秒 空间限制:32768K
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
斐波那契数列数列从0项开始的话是
- 0,1,1,2,3,5,8,13…
一开始少数了第一个“1”,真不知道之前的题怎么做对的。
一开始想用最简单的递归,不出所料的超时了。
继续用递归,加上重复的部分用数组存起来。(记忆化搜索)
class Solution {
public:
int F[40]={0,1,1}; // F[0]=0;F[1]=1;F[2]=1;是错误的。
int Fibonacci(int n)
{
if(n==0)
return 0;
if(F[n]!=0)
return F[n];
else
{
if(n<=2)
{
return F[n];
}
else
{
F[n]=Fibonacci(n-1)+Fibonacci(n-2);
return F[n];
}
}
}
};
这里遇到了一个错误:
- error: expected constructor, destructor, or type conversion before '='token
这个是本地编译器报的错,牛客网OJ报的不太一样
原因是,C++全局阈只能声明、初始化变量; 不能用于赋值、运算、调用函数等。
然后看了下讨论区大佬的答案,大佬果然是大佬。
class Solution {
public:
int Fibonacci(int n)
{
int f=0,s=1;
if(n==0) //加入0的判断
return 0;
for(;n>1;n--)
{
s=f+s;
f=s-f;
}
return s;
}
};
思路大概是:
只保存数列中的两项。零次计算时,保存的为第一项和第二项;计算n次,则保存的为第n项和第n+1项。我在之上加入0的判断,那么输出的即为计算n-1次的第n+1项。
大佬说这是动态规划的方法,我对动态规划只是有个简单的了解,这里应该深入一下。