我目前正在实现这个简单的代码,试图使用Python 2.7找到Fibonacci序列的第n个元素:
import numpy as np
def fib(n):
F = np.empty(n+2)
F[1] = 1
F[0] = 0
for i in range(2,n+1):
F[i]=F[i-1]+F[i-2]
return int(F[n])
这适用于F< 79,但之后我得错了号码。例如,根据wolfram alpha F79应该等于14472334024676221,但是fib(100)
给了我14472334024676220。我认为这可能是由python处理整数的方式引起的,但我不知道究竟是什么问题。非常感谢任何帮助!
答案 0 :(得分:11)
numpy数组的默认数据类型是depending on architecture 64(或32)位int。
纯python会让你有任意长整数; numpy没有。
所以numpy处理整数的方式更多;纯python会做得很好。
答案 1 :(得分:2)
Python将完全处理整数。的确,这就是python的 beauty 。另一方面,numpy
引入了丑陋,恰好完全没必要,并且可能会减慢你的速度。您的实现还需要更多空间。 Python允许您编写漂亮,可读的代码。这是Raymond Hettinger在Python中迭代的fibonacci的规范实现:
def fib(n):
x, y = 0, 1
for _ in range(n):
x, y = y, x + y
return x
那是O(n)时间和恒定空间。它美观,可读,简洁。只要您有内存将数字存储在您的计算机上,它也会为您提供正确的整数。如果它是合适的工具,请学会使用numpy
,并且重要的是,学会不在不合适时使用它。
答案 2 :(得分:0)
作为 hiro主角之前回答的补充说明,请注意,如果要求使用Numpy,您可以通过替换来轻松解决您的问题:
F = np.empty(n+2)
与
F = np.empty(n+2, dtype=object)
但除了将计算转回纯Python之外,它不会做任何事情。
答案 3 :(得分:0)
除非你想生成一个包含所有斐波那契数字的列表,直到Fn,不需要使用list,numpy或其他类似的东西,一个简单的循环和2个变量就足够了,因为你真的只需要知道之前的两个值
def fib(n):
Fk, Fk1 = 0, 1
for _ in range(n):
Fk, Fk1 = Fk1, Fk+Fk1
return Fk
当然,有更好的方法可以使用Fibonacci数字的数学属性来实现,我们知道有matrix可以给我们正确的结果
import numpy
def fib_matrix(n):
mat = numpy.matrix( [[1,1],[1,0]], dtype=object) ** n
return mat[0,1]
我认为他们有一个优化的矩阵exponentiation,使其比以前的方法更有效。
使用底层Lucas sequence的属性可以在没有matriz的情况下使用它,并且通过平方和与另一个相同数量的变量同样有效地取幂,但这有点难以理解乍一看不像第一个例子,因为除了第二个例子,它需要更多的数学。
封闭形式,具有黄金比例的形式,将更快地给你结果,但由于使用浮点运算,因此存在不准确的风险。