您的位置:首页 > 其它

[学习笔记]Fibonaci数列的递归与非递归算法实现

2014-08-27 15:47 253 查看
前一阵一直在忙实验室的事情,博客就暂时放下了,这次和大家分享一下Fibonaci数列的递归与非递归两种算法实现。

想必Fibonaci数列大家肯定都特熟,当输入正整数n为0或1时,f(0)=0,f(1)=1;当n大于1时f(n)=f(n-1)+f(n-2)。算法想必大家闭着眼睛都能写出来,典型的递归!如下:

long long Fibonaci1(unsigned int n)   //递归算法
{
if(n <= 1)
return n < 1 ? 0 : 1;

return Fibonaci1(n - 1) + Fibonaci1(n - 2);
}
通常来说,听到Fibonaci我们首先想到的就是递归,但是这并不能说明递归最适合这个题目。例如,我们要算f(10),首先要分别求f(9)和f(8);同样,要算f(9),就得先算f(8)和f(7);要求f(8)就得先求f(7)与f(6),以此类推。。。看出来了吗,大量的重复计算哦~大家可以把这个结构画成二叉树,就可以看出当n越大,重复的节点数将急剧增大,计算量也因此大大增加,实际上,此算法的时间复杂度是以n的指数的方式增加的。

看起来对这个问题递归不怎么划算呢~既然递归不好用,那就循环吧!

大致思想为:从底到上计算,即先根据f(0)和f(1)计算出f(2),再通过f(1)和f(2)计算出f(3),以此类推,直到f(n)为止。这样就能避免了大量的重复计算,其时间复杂度为O(n)。代码如下:

long long Fibonaci2(unsigned int n)
{
if(n <= 1)
return n < 1 ? 0 : 1;

long long fibNMinusOne = 1;
long long fibNMinusTwo = 0;
long long fibN = 0;

for(unsigned int i = 2;i <= n;i++)
{
fibN = fibNMinusOne + fibNMinusTwo;
fibNMinusTwo = fibNMinusOne;
fibNMinusOne = fibN;
}
return fibN;
}


很简单吧,而且一下就降低了时间复杂度!

好了,今天天气不错,阳光好还不热,可以听首老摇滚写写代码什么的,哈哈,祝大家好心情吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: