分类: WINDOWS
2009-11-03 13:05:35
斐波那契数列算法
1+1=2,1+2=3,2+3=5,3+5=8,5+8=13,,,,,一直到100以内 希望输出235813。。。。。。 不允许用递归,不允许用逆归式,不许用迭代, 还不允许用正向推导,好像是这么说的,我记的不太清楚了 那位高手能帮帮小弟 谢谢 关于斐波那契数列的算法比较 如果没看过钱能的<C++程序设计教程>的,下面我写的这个东西希望能给你们带来一点收获.看过钱能的书的,希望大家能多多交流. 在论坛的开发语言的C++区中,有人提到过有没有人有什么有趣的C语言题目.我当时推荐了这个斐波那契(Fibonacci)数列,最开始我没看钱能的书,也没编写出具体程序,只给了个大概思路,这里,钱能用C++将几种解决方法都写出来了,看了深有启发. 题 目:古典题目,有一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假设所有的兔子都不死,问每个月的兔子总数 为多少。对应的数列就是斐波那契(Fibonacci)数列:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n> 1). 思考:学习到了循环语句后老师就出了母牛问题给我们做.题目和兔子问题类似,思路也相同,程序显得相当简单.下面钱能给出了四个解决斐波那契(Fibonacci)数列的程序: 算法1: int fibo1(int n) { if(n==0) return 0; if(n==1) return 1; return fibo1(n-1)+fibo1(n-2); } 算法2: int fibo2(int n) { int a=0,c; for(int b=1,c,i=2; i<=n; ++i) c=a+b,a=b,b=c; return c; } 算法3: int fibo3(int n) { vector<int> v(n+1,0); v[1]=1; for(int i=2; i<=n; ++i) v=v[i-1]+v[i-2]; return v[n]; } 算法4: int fibo4(int n) { return (pow((1+sqrt(5.0))/2,n)-pow((1-sqrt(5,0))/2,n))/sqrt(5.0); } 这里列出了4个算法.下面就详细说明一下四个算法: 1. 递归算法:最好理解的算法,和人的思路相当接近,对应的数学描述很清晰,容易编程.但是在C++语言中是使用栈机制实现的,如果使用递归函数,将会占用大 量的内存资源,对内存中的栈区进行掠夺,在大量调用递归函数之后很可能造成内存崩溃,就算不崩溃,也会是长时间的运算.在调用了clock函数后,计算出 了递归函数的耗时,是四个函数中最大的.而且这是个致命的缺点.时间复杂度为O(2n)(括号内为2的n次方). 2.循环函数算法:这个 方法需要对整个数列有一定的把握,并且能看出其中的规律,用我们班的一位同学说的"就是不停的赋值& quot;.说的很形象,这样就是一个循环的过程,每次调用fibo2,都会一次次循环,时间复杂度为O(n2)(括号内为n的平方) 3.循环向量函数算法:同算法2类似,都是以循环来解决问题,但是算法3用向量先分配了一定的空间来实现,然后逐个求得向量的元素,最后得到数列的第n项值,这样就比算法2耗费更多的时间来进行下标操作,所以耗时比算法2多. 4.数学公式算法:使用一个数学公式来进行计算,几乎不耗什么时间,一次运算就可以得到结果,时间和n的取值没有太大关系,只和运算性能有关. 具体算法写出来后,首先排除算法1,这个算法太耗时,并且没有可取之处.其他三个算法是各有千秋,但是可以人为的测试时间: 环 境1:在循环加到一百万次时,分别取n为15,30,45得出算法2是最优的,时间消耗最少,少于0.3秒,算法3从1.4秒增加到3秒,算法4基本不 变,始终为2.1秒左右.这样我们就可以看出,算法2虽然比较复杂,但是效率最高,程序员追求的就是这个效果,让机器运算的最快. 环境2:在文件中读取自变量,比较算法2和算法3,文件中有一万个数据时算法2和算法3耗时几乎相同为1.7秒,但是文件中有三万个数据时算法2耗时5.6秒,算法3几乎没变,此时算法3显得更优. (时 间复杂度的解释说明:假设某算法的计算时间是f(n),其中变量可以是输入或输出量,也可以是两者之和或者其他可以计算时间的元素,一般以运算使用次数作 时间,那么如果这个算法在某台机器上运行时,所用的时间总是n,n2,2n,logn,n!,nm这些常量函数的一个常数倍,那么就说这个算法的时间复杂 度对应的是n,n2,2n,logn,n!,nm.)这些常量函数为n,n的平方,2的n次方,log n ,n的阶乘,n的m次方. 如果这个算法的时间复杂度不能跨越数量级而只是成倍数增长,比如算法a的时间复杂度是n,算法b的时间复杂度是2n,那么这两个算法的时间复杂度都是n.在各种算法中,O(n)表示时间复杂度为n,其他类似. O(1)< O(logn)<O(n)<O(nlogn)<O(n2)<O(2n)<O(n!)<O(nn) |