递推和递归——Fibonacci数列(原创)

原文链接: http://www.cnblogs.com/maodouzi/archive/2011/07/12/2104182.html

据说著名的斐波那契数列的起源,是某人(Fibonacci(Bonacci的儿子(都是外号啦)))在爬楼梯的时候突发奇想:

N阶的楼梯,一次爬两级,或者一次爬一级,有多少种爬法咧?

真是有想法!

先哲的智慧让人感叹。

废话少说,关于斐波那契数列的介绍,可以参见百度百科:http://baike.baidu.com/view/816.htm

通常Fibonacci数列的解法,是递归函数。

但是很明显,对于这个问题,递推是明显优于递归的。

这里分别给出两种解法,并比较两者的性能:

1. 递推解法:

 
   
1 def recursionFibonacci(num):
2 fibonacciList = []
3 for i in range(num):
4 fibonacciList.append((i + 1 ) if i < 2 else sum(fibonacciList[ - 2 :]))
5 return fibonacciList

2. 递归解法:

 
   
1 def recurrenceFibonacci(num):
2 return num if num < 3 else (recurrenceFibonacci(num - 1 ) + recurrenceFibonacci(num - 2 ))

3. 运行结果:

 
   
1 print recursionFibonacci( 100 )
2
3 [ 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , 233 , 377 , 610 , 987 , 1597 , 2584 , 4181 , 6765 , 10946 , 17711 , 28657 , 46368 , 75025 , 121393 , 196418 , 317811 , 514229 , 832040 , 1346269 , 2178309 , 3524578 , 5702887 , 9227465 , 14930352 , 24157817 , 39088169 , 63245986 , 102334155 , 165580141 , 267914296 , 433494437 , 701408733 , 1134903170 , 1836311903 , 2971215073L , 4807526976L , 7778742049L , 12586269025L , 20365011074L , 32951280099L , 53316291173L , 86267571272L , 139583862445L , 225851433717L , 365435296162L , 591286729879L , 956722026041L , 1548008755920L , 2504730781961L , 4052739537881L , 6557470319842L , 10610209857723L , 17167680177565L , 27777890035288L , 44945570212853L , 72723460248141L , 117669030460994L , 190392490709135L , 308061521170129L , 498454011879264L , 806515533049393L , 1304969544928657L , 2111485077978050L , 3416454622906707L , 5527939700884757L , 8944394323791464L , 14472334024676221L , 23416728348467685L , 37889062373143906L , 61305790721611591L , 99194853094755497L , 160500643816367088L , 259695496911122585L , 420196140727489673L , 679891637638612258L , 1100087778366101931L , 1779979416004714189L , 2880067194370816120L , 4660046610375530309L , 7540113804746346429L , 12200160415121876738L , 19740274219868223167L , 31940434634990099905L , 51680708854858323072L , 83621143489848422977L , 135301852344706746049L , 218922995834555169026L , 354224848179261915075L , 573147844013817084101L ]
4
5   print recurrenceFibonacci( 40 )
6
7   165580141

结论:

1. 用递推法打印完整的Fibonacci数列列表,N=100,运行时间毫秒级别。

2. 用递归法,打印N=40的Fibonacci数,需要一分钟时间(我是惠普4420s的机器,酷睿4核)。悲摧。

3. 递推在时间上有着无限优势。

转载于:https://www.cnblogs.com/maodouzi/archive/2011/07/12/2104182.html

猜你喜欢

转载自blog.csdn.net/weixin_30335575/article/details/94796317
今日推荐