算法之递归算法(斐波那契数列之美)(100级阶梯,1,2步,几种方法)

来源:互联网 发布:微耕门禁数据库表结构 编辑:程序博客网 时间:2024/04/28 20:19

原题如下,有一个100个台阶的阶梯,一次可以选择上一个台阶,或者两个台阶,最后上到楼梯顶有几种走法?


斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1960年代起出版了《斐波纳契数列》季刊,专门刊载这方面的研究成果。


问题规模从小化开始分解,当1个阶梯的时候,1种方法;当2个阶梯的时候,2种方法;当3个阶梯的时候,3种方法;当4个阶梯的时候,5种方法;当5个阶梯的时候,8种方法。。。。。。

SO,这是一个斐波那契数列问题。

小弟,写了个递归算法的程序来计算下100位的那个数是多少?


#include <stdio.h>#include <unistd.h>#include <time.h>long int Fibonacci( int number){    if (number ==0 || number ==1) {        return number;    }else{        return Fibonacci(number-2) + Fibonacci(number-1);    }}int main(int argc, const char * argv[]){    long int number = 1;    int i;        for (i = 1; i <= 101; i++) {                clock_t t1 = clock();        printf("肥波那切第%d个是 %ld\n",i,Fibonacci(i));        clock_t t2 = clock();        printf("肥波那切第%d个数字,耗时%f秒\n",i,(double)(t2-t1)/CLOCKS_PER_SEC);    }        return 0;}


看下我的计算机配置



然后,为了看下递归算法的效率问题,使用clock()函数(#include<time.h>)看下计算数列的时间。

肥波那切第1个是 1肥波那切第1个数字,耗时0.000007秒肥波那切第2个是 1肥波那切第2个数字,耗时0.000004秒肥波那切第3个是 2肥波那切第3个数字,耗时0.000002秒肥波那切第4个是 3肥波那切第4个数字,耗时0.000003秒肥波那切第5个是 5肥波那切第5个数字,耗时0.000003秒肥波那切第6个是 8肥波那切第6个数字,耗时0.000002秒肥波那切第7个是 13肥波那切第7个数字,耗时0.000004秒肥波那切第8个是 21肥波那切第8个数字,耗时0.000004秒肥波那切第9个是 34肥波那切第9个数字,耗时0.000003秒肥波那切第10个是 55肥波那切第10个数字,耗时0.000004秒肥波那切第11个是 89肥波那切第11个数字,耗时0.000006秒肥波那切第12个是 144肥波那切第12个数字,耗时0.000008秒肥波那切第13个是 233肥波那切第13个数字,耗时0.000010秒肥波那切第14个是 377肥波那切第14个数字,耗时0.000014秒肥波那切第15个是 610肥波那切第15个数字,耗时0.000038秒肥波那切第16个是 987肥波那切第16个数字,耗时0.000033秒肥波那切第17个是 1597肥波那切第17个数字,耗时0.000048秒肥波那切第18个是 2584肥波那切第18个数字,耗时0.000078秒肥波那切第19个是 4181肥波那切第19个数字,耗时0.000125秒肥波那切第20个是 6765肥波那切第20个数字,耗时0.000197秒肥波那切第21个是 10946肥波那切第21个数字,耗时0.000317秒肥波那切第22个是 17711肥波那切第22个数字,耗时0.000502秒肥波那切第23个是 28657肥波那切第23个数字,耗时0.000778秒肥波那切第24个是 46368肥波那切第24个数字,耗时0.001260秒肥波那切第25个是 75025肥波那切第25个数字,耗时0.002034秒肥波那切第26个是 121393肥波那切第26个数字,耗时0.003289秒肥波那切第27个是 196418肥波那切第27个数字,耗时0.005324秒肥波那切第28个是 317811肥波那切第28个数字,耗时0.008609秒肥波那切第29个是 514229肥波那切第29个数字,耗时0.013923秒肥波那切第30个是 832040肥波那切第30个数字,耗时0.023116秒肥波那切第31个是 1346269肥波那切第31个数字,耗时0.038816秒肥波那切第32个是 2178309肥波那切第32个数字,耗时0.062723秒肥波那切第33个是 3524578肥波那切第33个数字,耗时0.100141秒肥波那切第34个是 5702887肥波那切第34个数字,耗时0.162453秒肥波那切第35个是 9227465肥波那切第35个数字,耗时0.262944秒肥波那切第36个是 14930352肥波那切第36个数字,耗时0.412486秒肥波那切第37个是 24157817肥波那切第37个数字,耗时0.669751秒肥波那切第38个是 39088169肥波那切第38个数字,耗时1.095143秒肥波那切第39个是 63245986肥波那切第39个数字,耗时1.771608秒肥波那切第40个是 102334155肥波那切第40个数字,耗时2.821634秒肥波那切第41个是 165580141肥波那切第41个数字,耗时4.565981秒肥波那切第42个是 267914296肥波那切第42个数字,耗时7.299127秒肥波那切第43个是 433494437肥波那切第43个数字,耗时11.804256秒肥波那切第44个是 701408733肥波那切第44个数字,耗时19.249104秒肥波那切第45个是 1134903170肥波那切第45个数字,耗时30.882790秒肥波那切第46个是 1836311903肥波那切第46个数字,耗时50.059402秒肥波那切第47个是 2971215073肥波那切第47个数字,耗时81.122859秒肥波那切第48个是 4807526976肥波那切第48个数字,耗时131.617654秒肥波那切第49个是 7778742049肥波那切第49个数字,耗时213.326472秒肥波那切第50个是 12586269025肥波那切第50个数字,耗时344.160353秒肥波那切第51个是 20365011074肥波那切第51个数字,耗时555.599157秒肥波那切第52个是 32951280099肥波那切第52个数字,耗时900.098143秒肥波那切第53个是 53316291173肥波那切第53个数字,耗时1455.740086秒肥波那切第54个是 86267571272肥波那切第54个数字,耗时2367.473675秒肥波那切第55个是 139583862445肥波那切第55个数字,耗时3791.005930秒肥波那切第56个是 225851433717肥波那切第56个数字,耗时6118.214521秒肥波那切第57个是 365435296162肥波那切第57个数字,耗时9897.173980秒肥波那切第58个是 591286729879肥波那切第58个数字,耗时16016.764547秒



斐波那契数列是一个充满哲理、充满人生韵味和上帝之手的神奇数列。这个数列似乎是冥冥之中的命运之手,掌握着宇宙中的终极奥秘之一。


仔细观察计算斐波那契数列的时间,竟然也是斐波那契数列。

由于效率方面的原因,计算到58个数字暂停。遵循这个计算规律,可以得出就算出100级台阶的101个数字的时间是第60位斐波那契数字的10倍时间(以s为单位)。

第60位数字是154800855920,以我这台电脑的cpu来计算的话,大概需要的时间是1548008559200s,

25800142653.3min,

430002377.555h,

17916765.7315d,

597225.524382m,

49768.7936985y。


没错,使用这台电脑计算101位的斐波那契数列,使用递归算法的话,大约需要49768年的时间。

OH,my God!

到这里,你会明白一点这个问题的意思。


水平有限,欢迎指正,谢谢。

未完。


时间有限,持续更新。