据说著名的斐波那契数列的起源,是某人(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 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 ))
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
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