Fibonacci序列(递归-傻孩子版)
( 源程序包在QQ群中 号码7972471,开发环境是VC.net 2003,另外很抱歉,我实在不想把它翻译成中文,太别扭了,鸡肠子没学好的多包含呀 )
所谓Fibonacci序列是指的下面这样一种序列
1,1,2,3,5,8,13,21,34.......
发现它们的规律了吗?呵呵,对,除了前两个数外,所有数都是前两个数字的和,这在很多IQ测试题里都有的哦~你的智商测试又能多拿两分了。而且,这种序列能表示自然界中很多种优美的曲线,最熟悉的应该是我们经常能看见的海螺的曲线了。想到了么?就是螺旋曲线!
它可以用下面的方程来表示:
┏ 1 n = 0
F(n) = ┫ 1 n = 1
┗ F(n-1) + F(n-2) n > 1
知道什么是递归吗?真不知道?那你该趁大学生毕业,去找他们收购几本二手课本好好恶补一下了。简单的说,就是自己调用自己来解决问题,看看上面的方程就知道了,例如F(3) = F(2) + F(1),而 F(2) = F(1) + F(0), Bingo!所以说最终的答案就是 3
源代码中示范了一个使用递归算法来求解Fibonacci数列的例子:如果本身解决不了这个问题,但是解决这个问题的前提已知则能求解这个问题的话,便把这个问题转换成求解这些前提的问题。而如若恰巧其前提又是这个问题本身,于是就造成了一种循环的递归调用。直到遇到一个确切的结果定义而返回,答案便逆流而上返回给问题的调用者.
这种解决方案的好处就是简单,是的,相当简单,几乎不经过任何思考,就可以简单地完成求解.但是中学政治老师没教过你矛盾论吗?当然还有两面性的道理罗,使用这么简单的算法所要承受的是时间和空间(存储空间)上的限制了。也许是我的机器已经被我蹂躏得跑不动了吧,在n=40左右的时候它已经慢得让我想把它卖给路边10元收购旧电脑的家伙了,但是无奈我还没想好要买什么,所以暂时让它继续跑会吧:P
程序代码片段:
// Fibonacci_t 是我定义的一个数据类型,暂时是__int64
Fibonacci_t Fibonacci_Recursion::Caculate( int n )
{
return n<=1? 1 : Caculate( n-2 ) + Caculate( n-1 );
}
这是DEBUG版本 n=25到n=40的数据 单位:毫秒
F(25)=121393 Time elapsed:15
F(26)=196418 Time elapsed:16
F(27)=317811 Time elapsed:16
F(28)=514229 Time elapsed:47
F(29)=832040 Time elapsed:62
F(30)=1346269 Time elapsed:109
F(31)=2178309 Time elapsed:172
F(32)=3524578 Time elapsed:282
F(33)=5702887 Time elapsed:453
F(34)=9227465 Time elapsed:718
F(35)=14930352 Time elapsed:1172
F(36)=24157817 Time elapsed:1891
F(37)=39088169 Time elapsed:3047
F(38)=63245986 Time elapsed:4953
F(39)=102334155 Time elapsed:8000
F(40)=165580141 Time elapsed:12922
这是Release版本 n=25到n=40的数据 单位:毫秒
F(25)=121393 Time elapsed:0
F(26)=196418 Time elapsed:0
F(27)=317811 Time elapsed:0
F(28)=514229 Time elapsed:16
F(29)=832040 Time elapsed:0
F(30)=1346269 Time elapsed:31
F(31)=2178309 Time elapsed:31
F(32)=3524578 Time elapsed:47
F(33)=5702887 Time elapsed:78
F(34)=9227465 Time elapsed:125
F(35)=14930352 Time elapsed:219
F(36)=24157817 Time elapsed:328
F(37)=39088169 Time elapsed:563
F(38)=63245986 Time elapsed:875
F(39)=102334155 Time elapsed:1437
F(40)=165580141 Time elapsed:2328
咳...你愿意花13秒的时间去等一个简单的运算结果吗?如果你愿意,那么我想你该改行了,趁着还有梦想和追求,赶紧换工作吧~软件研发不适合你的~呵呵~~~~开玩笑的,别拍我砖
想要知道怎么改善?看Fibonacci的另一个算法吧.