Python中不准确的大Fibonacci数
我目前正在使用Python 2.7实现这段简单代码,试图找到斐波那契序列的第n个元素:Python中不准确的大Fibonacci数,python,fibonacci,Python,Fibonacci,我目前正在使用Python 2.7实现这段简单代码,试图找到斐波那契序列的第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
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处理整数的方式造成的,但我不知道到底是什么问题。非常感谢您的帮助 numpy数组的默认数据类型是64(或32)位int
纯python可以让您拥有任意长的整数;努比没有
所以这更像是numpy处理整数的方式;纯python就可以了。作为hiro Progator前面回答的补充,请注意,如果需要使用Numpy,您可以通过替换以下内容轻松解决问题:
F = np.empty(n+2)
与
但它只不过是将计算返回到纯Python中而已。Python在这里可以很好地处理整数。事实上,这就是python的魅力所在<另一方面,code>numpy,引入了丑陋,只是碰巧完全没有必要,而且可能会让你慢下来。您的实现还需要更多的空间。Python允许您编写漂亮、可读的代码。以下是Raymond Hettinger在Python中迭代斐波那契的规范实现:
def fib(n):
x, y = 0, 1
for _ in range(n):
x, y = y, x + y
return x
这就是O(n)时间和恒定空间。它美观、易读、简洁。它还将为您提供正确的整数,只要您有内存在计算机上存储该数字。当它是合适的工具时,学会使用
numpy
,同样重要的是,学会在不合适的时候不要使用它。除非你想生成一个包含所有斐波那契数的列表,直到Fn,否则没有必要使用列表、numpy或其他类似的东西,一个简单的循环和两个变量就足够了,因为您只需要知道前面的两个值
def fib(n):
Fk, Fk1 = 0, 1
for _ in range(n):
Fk, Fk1 = Fk1, Fk+Fk1
return Fk
当然,有更好的方法可以利用数字的数学特性来实现,我们知道有一种方法可以给出正确的结果
import numpy
def fib_matrix(n):
mat = numpy.matrix( [[1,1],[1,0]], dtype=object) ** n
return mat[0,1]
我假设他们有一个优化的矩阵,使得它比以前的方法更有效
使用底层的属性可以在不使用矩阵的情况下实现,并且与平方求幂一样有效,变量数量也与其他变量相同,但这与第一个示例不同,乍一看有点难以理解,因为与第二个示例一起,它需要更多的数学知识
带有黄金分割率的闭合形式将更快地给出结果,但由于使用了浮点运算,因此存在不准确的风险 为什么在这里使用
numpy
?这毫无意义,可能只会让你慢下来。我怀疑这是由于使用np.empty
和int
处理小变化的方式而引起的问题。如果只返回结果,为什么还要将它们存储在列表中?您可以轻松地跟踪函数中的两个数字。我最近才开始使用numpy(以及python),并希望使用它来实现我在过去几天学到的一些命令。应该遵守基本命令。谢谢,谢谢。戴维斯:谢谢,不过我现在在玩斐波那契序列,可能还想返回整个序列F。但是你的建议对于上面的函数来说更有意义,谢谢!非常感谢,这是有道理的。我现在使用的是列表,而不是numpy,它很有效。很有帮助+1@berkju:非常欢迎!我相信你知道,这是一种效率极低的获取大fibonacci数的方法(除非你需要所有的数字)。32位整数的良好捕捉。传递dtype=np.uint64
使OP的函数工作。
import numpy
def fib_matrix(n):
mat = numpy.matrix( [[1,1],[1,0]], dtype=object) ** n
return mat[0,1]