Fibonacci序列中非常大的数字可能出错(Python 2.7.6整数学)

时间:2016-05-01 18:19:58

标签: python python-2.7

编辑以粗体显示问题。

我编写了以下Python代码(使用Python 2.7.6)来计算Fibonacci序列。它没有使用任何额外的库,只有核心的python模块。

我想知道我可以计算的序列的条件是否有限,可能是由于结果整数的荒谬长度,或者是否有一个点Python不再准确地执行计算。

此外,对于fibopt(n)函数,似乎有时会在所请求的项下返回该项(例如,第99次而不是100次),但总是以较低的条件(第1,第2,第10,第15)工作。为什么?

def fibopt(n): # Returns term "n" of the Fibonacci sequence.
    f = [0,1] # List containing the first two numbers in the Fibonacci sequence.
    x = 0 # Empty integer to store the next value in the sequence. Not really necessary.
    optnum = 2 # Number of calculated entries in the sequence. Starts at 2 (0, 1).
    while optnum < n: # Until the "n"th value in the sequence has been calculated.
        if optnum % 10000 == 0:
            print "Calculating index number %s." % optnum # Notify the user for every 10000th value calculated. This is useful because the program can take a very long time to calculate higher values (e. g. about 15 minutes on an i7-4790 for the 10000000th value).
        x = [f[-1] + f[-2]] # Calculate the next value in the sequence based of the previous two. This could be built into the next line.
        f.extend(x) # Append that value to the sequence. This could be f.extend([f[-1] + f[-2]]) instead.
        optnum +=1 # Increment the counter for number of values calculated by 1.
        del f[:-2] # Remove all values from the table except for the last two. Without this, the integers become so long that they fill 16 GB of RAM in seconds.
    return f[:n] # Returns the requested term of the sequence.

def fib(n): # Similar to fibopt(n), but returns all of the terms in the sequence up to and including term "n". Can use a lot of memory very quickly.
    f = [0,1]
    x = 0
    while len(f) < n:
        x = [f[-1] + f[-2]]
        f.extend(x)
    return f[:n]

3 个答案:

答案 0 :(得分:1)

好消息是:Python中的整数数学很容易 - 没有溢出。

只要您的整数适合C ^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)"\s+"([^"]+)"$ ,Python就会使用它。一旦你超过它,它将自动提升为任意精度整数(这意味着它将更慢并使用更多的内存,但计算将保持正确)。

唯一的限制是:

  1. Python进程可寻址的内存量。如果您使用的是32位Python,则需要能够将所有数据都装入2 GB或RAM(过去那些,并且您的程序将因long而失败)。如果您使用的是64位Python,则物理RAM +交换文件是理论上的限制。

  2. 您在执行计算时愿意等待的时间。整数越大,计算越慢。如果您曾经达到交换空间,您的计划将达到大陆漂移水平的缓慢。

答案 1 :(得分:0)

Python整数可以表示任意长度的值,并且不会自动转换为float。您只需创建一个非常大的数字并检查其类型即可进行检查:

>>> type(2**(2**25))
<class 'int'>  # long in Python 2.x

fibopt返回f[:n],这是一个列表。您似乎期望它返回一个术语,因此期望(第一个注释)或实现必须更改。

答案 2 :(得分:0)

如果你去Python 2.7文档,有一个关于Fibonacci数字的部分。在斐波那契数字的这一部分中,任意结束并不是我们都希望看到的细长答案。它会缩短它。

如果这不能回答您的问题,请参阅:4.6定义功能。

如果您已下载解释器,则会预先安装手册。如有必要,您可以在www.python.org上线,或者您可以查看您的手册,查看以#34;任意&#34;结尾的斐波那契数字。简而言之,即不是整个数值。

赛斯

P.S。如果您对手册中的哪个部分有任何疑问,请参阅The Python Tutorial / 4。更多控制流工具/ 4.6定义功能。我希望这有点帮助。