Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中不准确的大Fibonacci数_Python_Fibonacci - Fatal编程技术网

Python中不准确的大Fibonacci数

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

我目前正在使用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<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]