如果你想快速计算斐波那契数,你应该使用封闭表达式或矩阵求幂。如果您希望能够生成任意大的数字,请使用矩阵求幂。
一个示例实现:
>>> def matrix_mul(A, B):
... return ([A[0][0] * B[0][0] + A[0][1] * B[1][0],
... A[0][0] * B[0][1] + A[0][1] * B[1][1]],
... [A[1][0] * B[0][0] + A[1][1] * B[1][0],
... A[1][0] * B[0][1] + A[1][1] * B[1][1]])
...
>>> def matrix_exp(A, e):
... if not e:
... return [[1,0],[0,1]]
... elif e % 2:
... return matrix_mul(A, matrix_exp(A, e-1))
... else:
... sq= matrix_exp(A, e//2)
... return matrix_mul(sq, sq)
...
>>> def fibo(n):
... M = [[1,1],[1,0]]
... return matrix_exp(M, n)[0][0]
>>> fibo(1)
1
>>> fibo(2)
2
>>> fibo(3)
3
>>> fibo(4)
5
>>> fibo(5)
8
>>> fibo(115)
781774079430987230203437L
>>> fibo(123456)
#instantaneus output of a HUGE number
还有这个不可读的版本要快得多:
>>> fibs = {0: 0, 1: 1}
>>> def fib(n):
... if n in fibs: return fibs[n]
... if n % 2 == 0:
... fibs[n] = ((2 * fib((n / 2) - 1)) + fib(n / 2)) * fib(n / 2)
... return fibs[n]
... else:
... fibs[n] = (fib((n - 1) / 2) ** 2) + (fib((n+1) / 2) ** 2)
... return fibs[n]
...
>>> timeit.timeit('fib(1000000)', 'from __main__ import fib', number=100)/100
0.0012753009796142578 # 1 millisecond for the millionth fibonacci number :O
这是 literateprograms.org 的最后一个(链接在另一个答案中)。