题目描述
代码分析
/**
*
* @param n int整型
* @return int整型
*/
int Fibonacci(int n ) {
// write code here
int ans = 0;//存放最终结果
int Front[2] = {0,1};//递归公式前2项
if( n < 2 )
{
switch (n)
{
case 0: ans = 0;break;
case 1: ans = 1;break;
}
}
else{
while(n-1)
{
ans = Front[0] + Front[1];
Front[0] = Front[1];
Front[1] = ans;
n--;
}
}
return ans;
}
如果直接用递归来解的话,提交后会超出时间限制,毕竟递归过程中产生中间结果开销实在是太大了。
于是,考虑到斐波那契数列的求解表达式为
F(n) = F(n-1) + F(n-2)
其中,F(0)=0,F(1)=1
如果把每一次两项相加作为一层,求解F(n)时,递归得到F(1)+F(0)层,相加的两项都是已知项才可以得出结果。照这个想法,我们设置Front[2]数组来存储F(n-1)和F(n-2)的值,每层计算结束后只需要将二者和放在F[1]中,原来的F[1]前移放到F[0]中,以此进行下一层的操作即可。
下表就是递归过程中待求项和递归层数的关系:
待求项 | 递归层数 |
---|---|
F(2) | 1 |
F(3) | 2 |
F(4) | 3 |
… | … |
F(n) | n-1 |