索引请参考:系列目录
题目:
- 写一个函数,输入n,求斐波那契额数列的第n项。
- 斐波那契额数列的定义如下:
分析:
- 利用上述公式计算第n项斐波那契项可以实现,但是由于递归造成的时间可空间消耗很大。思路(2)对该算法进行了修改,使得不断地递归变成了有限项的迭代,大大减少了时间的消耗和空间消耗。
思路:
(1)按照上述公式实现该算法:
(2)其实斐波那契数列从第二项开始的规律是第n项等于前两项的和。
- 方法:把已经得到的数列中间项保存起来。具体实现见代码。
方法(1):
int fibonaccic(const int n) {
if (n == 0)
return 0;
else if (n == 1)
return 1;
else
return fibonaccic(n - 1) + fibonaccic(n - 2);
}
牛客运行结果:
方法(2)
int result[2] = { 0,1 };
if (n < 2)
return result[n];
int Fn, Fn_1 = 1, Fn_2 = 0;//一开始的前两项为0 1
for (int i = 2; i <= n; ++i)
{
Fn = Fn_1 + Fn_2;
Fn_2 = Fn_1;
Fn_1 = Fn;
}
return Fn;
牛客运行结果:
评注:
通过两种方法可以看出,方法(1)在时间效率上大大提高了,其中表层的原因是将算法中的大量迭代转变成了有限项的迭代。深层的原因是有关于函数调用的过程,其中涉及到了临时变量、返回结果的压栈、出栈以及函数传参过程中拷贝所涉及的时间消耗等。其中,算法所占用的内存也有所改善。