我写了一个程序来计算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)
答案 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的不正确实例化,导致生成的序列不正确。