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

据说著名的斐波那契数列的起源,是某人(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. 递推在时间上有着无限优势。

posted @ 2011-07-12 13:33  毛豆子  阅读(3239)  评论(1编辑  收藏  举报