[学习笔记]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)。算法想必大家闭着眼睛都能写出来,典型的递归!如下:
看起来对这个问题递归不怎么划算呢~既然递归不好用,那就循环吧!
大致思想为:从底到上计算,即先根据f(0)和f(1)计算出f(2),再通过f(1)和f(2)计算出f(3),以此类推,直到f(n)为止。这样就能避免了大量的重复计算,其时间复杂度为O(n)。代码如下:
很简单吧,而且一下就降低了时间复杂度!
好了,今天天气不错,阳光好还不热,可以听首老摇滚写写代码什么的,哈哈,祝大家好心情吧!
想必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; }
很简单吧,而且一下就降低了时间复杂度!
好了,今天天气不错,阳光好还不热,可以听首老摇滚写写代码什么的,哈哈,祝大家好心情吧!
相关文章推荐
- STL学习笔记:用非递归的方法实现汉诺塔问题
- 斐波那契数列的递归与非递归算法实现及其时间复杂度
- 数据结构与算法分析学习笔记--第四章(搜索二叉树,递归和非递归实现删除、插入)
- Fibonacii数列的递归与非非递归实现(java)
- 算法(第四版)学习笔记之二分查找的递归与非递归java实现
- fibonacii数列(斐波那契数列)的递归实现及循环实现
- 算法(第4版) 学习笔记二——二分查找的普通实现与递归实现
- php学习笔记:利用递归实现删除文件目录
- 【学习笔记】非递归实现先后根遍历二叉树
- 孙鑫VC学习笔记:第十七讲 用剪贴板实现进程间的通信
- PetShop3.x学习笔记5-我读cocoboy79《MS PetShop 3.x 设计与实现——数据访问层》
- C#中实现事件的学习笔记
- 孙鑫VC学习笔记:第十六讲 利用事件对象实现线程间的同步
- 《面向对象基础:C++实现》学习笔记之三
- 《面向对象基础:C++实现》学习笔记之四
- PetShop3.x学习笔记5-我读cocoboy79《MS PetShop 3.x 设计与实现——数据访问层》
- 《面向对象基础:C++实现》学习笔记之六
- [ASP.NET学习笔记之十]ASP.NET实现在服务器端控制网页
- 递归转非递归(学习笔记)
- PetShop3.x学习笔记5-我读cocoboy79《MS PetShop 3.x 设计与实现——数据访问层》