Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.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 - Fatal编程技术网

在python中查找有限时间内的最大Fibonacci数

在python中查找有限时间内的最大Fibonacci数,python,Python,我需要一个代码来计算第n个斐波那契数,并用python给我计算它所用的时间 def fib(n): if n==0 or n==1: return 1 else: return fib(n-1)+fib(n-2) 数字步长的计算必须使用这种方法。这是一个经典的动态规划/递归记忆问题。请注意,在您的代码中,递归调用了很多fib(x-1)。这是一个巨大的工作浪费:一旦你计算了一次,你应该把它存储起来供以后使用,这样你就不必再计算了。在Python3中,您可以使用 这种技术称为带记忆

我需要一个代码来计算第n个斐波那契数,并用python给我计算它所用的时间

def fib(n):
    if n==0 or n==1: return 1
    else: return fib(n-1)+fib(n-2)

数字步长的计算必须使用这种方法。

这是一个经典的动态规划/递归记忆问题。请注意,在您的代码中,递归调用了很多
fib(x-1)
。这是一个巨大的工作浪费:一旦你计算了一次,你应该把它存储起来供以后使用,这样你就不必再计算了。在Python3中,您可以使用

这种技术称为带记忆的递归。同样,您可以使用动态规划:自下而上计算值:

fibs = [0, 1]
for i in range(2, n):
    calculate fibs[i] using the previous values in fibs
    append the new value

要对这些函数计时,请将它们放入模块(以
.py
结尾的文件)中,并从命令行使用
timeit

(change directory to the one containing your module)
python -mtimeit "import <name of module>" "fib(3000)"
(将目录更改为包含模块的目录)
python-mtimeit“导入”fib(3000)

顺便说一下,第n个斐波那契数有一个封闭形式的表达式,它可能会更快/更有用:

在哪里

使用模块对功能计时:

import timeit

def fib(x):
    if x==0 or x==1: return 1
    else: return fib(x-1)+fib(x-2)

print timeit.Timer('fib(5)', 'from __main__ import fib').timeit()
输出:

3.12172317505
要直接回答标题中的问题,可以使用以秒为单位获取自历元以来的当前时间,并继续计算后续斐波那契数,直到达到时间限制。我选择了下面一种计算斐波那契数的有效方法来更好地演示这个概念

def fibTimeLimited(limit):
  start = time.time()
  n, f0, f1 = 1, 0, 1
  while time.time() < start + limit:
    n += 1
    f0, f1 = f1, f0+f1
  return (n, f1)

下面是一个使用Python元组而不是递归的非常简单的示例

import time

def fib(n):
    cnt = 1
    if n == 0:
        return a
    a = 0
    b = 1
    while n > cnt:
        (a, b) = (b, b+a)
        cnt += 1
    return b

start = time.time()
result = fib(15)
runTime = time.time() - start

print result, runTime


首先,请正确格式化您的代码。编辑问题。格式规则在右下角。第二,请用[家庭作业]标签标记你的家庭作业。最后,请发布您尝试使用的代码和错误。我们不喜欢为你做家庭作业。但我们将回答具体问题。请使用{}将代码文本放在代码块中使用递归执行此计算会导致可怕的结果performance@David赫弗南:除非你回忆。@katrielalex避免递归并使用带有两个工作变量的简单循环仍然会快得多+1 lru_缓存听起来很棒,以前从未遇到过,谢谢!这是记忆而不是记忆。缓存很好,谢谢你,但我只需要使用这个fib(x-1)。因此,速度不是问题。这仍然是一个很棒的帖子@奥兹格:我不确定我是否理解你的说法。想想当你计算
fib(4)
时会发生什么:你计算
fib(3)
,这需要
fib(2)
(这需要
fib(1)
fib(0)
)和
fib(2)
,你已经计算出来了!缓存确保您不会重复自己的操作。如果你为
fib(10)
等绘制一个树形图,你会看到任何分支是如何复制的。@razpeitia对不起,我的坏,现在已经修复,现在将学会停止!但最后一件事,这是对的?另外,输出所需的时间,比如说x=8,相当多,为什么?@ozgur输出是纳秒,也就是千分之一毫秒@katriealex的回答解释了为什么即使是很小的数字,速度也很慢,以及如何加快速度。现在,加速并不是一个真正的问题,我只是好奇为什么速度慢,再次感谢you@David你是对的,但是OP已经多次声明现在他只关心运行时间,所以我没有把重点放在边缘情况或性能上。@Abizern-1基本思想是合理的,只是很遗憾它得到了答案wrong@David-更改了初始计数变量。现在给出F15的610。我还错过了什么吗?@David-我很感激你的逆转。如果您编辑代码来更正它,我也不会生气。:)@阿比泽恩差不多。原始问题、已接受的答案和您的答案都返回1表示fib(0),而实际上0是正确的。@Abizerm整个问题说明了在开发代码时编写一些测试是多么重要。fib的错误实现比正确实现更多。见鬼,他们中有些人跑得很快,但很快就得到错误的答案并不难!!
def fibTimeLimited(limit):
  start = time.time()
  n, f0, f1 = 1, 0, 1
  while time.time() < start + limit:
    n += 1
    f0, f1 = f1, f0+f1
  return (n, f1)
Calculated 1st fibonacci number as 1 in 0.000001 seconds
Calculated 31st fibonacci number as 1346269 in 0.000010 seconds
Calculated 294th fibonacci number as 12384578529797304192493293627316781267732493780359086838016392 in 0.000100 seconds
import time

def fib(n):
    cnt = 1
    if n == 0:
        return a
    a = 0
    b = 1
    while n > cnt:
        (a, b) = (b, b+a)
        cnt += 1
    return b

start = time.time()
result = fib(15)
runTime = time.time() - start

print result, runTime