编辑以粗体显示问题。
我编写了以下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]
答案 0 :(得分:1)
好消息是:Python中的整数数学很容易 - 没有溢出。
只要您的整数适合C ^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)"\s+"([^"]+)"$
,Python就会使用它。一旦你超过它,它将自动提升为任意精度整数(这意味着它将更慢并使用更多的内存,但计算将保持正确)。
唯一的限制是:
Python进程可寻址的内存量。如果您使用的是32位Python,则需要能够将所有数据都装入2 GB或RAM(过去那些,并且您的程序将因long
而失败)。如果您使用的是64位Python,则物理RAM +交换文件是理论上的限制。
您在执行计算时愿意等待的时间。整数越大,计算越慢。如果您曾经达到交换空间,您的计划将达到大陆漂移水平的缓慢。
答案 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定义功能。我希望这有点帮助。