在为函数添加模数后,所有输出都为零

时间:2014-02-07 02:27:39

标签: python fibonacci modulo

我写了一个程序来计算Fibonacci数,它运行正常。然后我改变了程序,给我模数为65536的Fibonacci数,并且我的所有输出都变为零。出了什么问题?

import time
def fib_matrix_timed(min):
    timeout = time.time() + 60*min
    A = [0, 1]
    i = 1
    while time.time() < timeout:
        try:
            B = A
            A[0] = B[1]
            A[1] = ((B[0] + B[1])%65536)
            print A[0]
            i+=1
        except OverflowError:
            print "fib_iterative overflows at ", i
    print A[0]
    print "fib_matrix calculated ", i, "iterations in", min, "minute(s)"

fib_matrix_timed(1)

1 个答案:

答案 0 :(得分:1)

你的问题是:

B = A

python中的列表是mutable,这意味着当你这样做时,A是与B相同的对象,而不是新列表。因此,无论何时更改列表A或列表B,您都可以同时有效地更改两个列表。

这一行可以改为:

B = [A[0], A[1]]

或者:( MarcosModenesi的建议)

B = A[:] # works for list of any size containing immutable objects

不是让B只是对A的同一个对象的引用,而是使用原始值创建一个全新的实例。

以下示例说明了B与A列表相同时的问题。

假设A是[0,1]:

B = A

现在B是A是[0,1]

A[0] = B[1]

B 1是1,所以现在A [0]是B [0]是1. A和B现在都是[1,1]。

A[1] = (B[0] + B[1]) % 65536

A和B现在是[1,2]

由此产生的序列是1,2,4,8,16,32 ....

由于65536是2 ^ 16,即序列中的第17个数字,当然模数将是2 ^ 16 * 2 ^ n%2 ^ 16 = 0.

问题源于列表B的不正确实例化,导致生成的序列不正确。