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

时间:2010-12-26 16:11:29

标签: python

我需要一个代码来计算第n个斐波纳契数,并在python中给我时间来计算它。

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

数字步骤的计算必须使用这样的方法。

3 个答案:

答案 0 :(得分:7)

这是一个带有memoization问题的经典动态编程/递归。请注意,在您的代码中,您递归调用fib(x-1) lot 。这是一个巨大的浪费:一旦你计算一次,你应该存储它以供以后使用,这样你就不必再计算它了。在Python 3中,您可以使用光荣的functools.lru_cache

来完成此任务
@lru_cache(maxsize=None)
def fib(n):
    if n < 1:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

不幸的是,由于没有人使用Python 3.2,你必须自己编写。这是一些伪代码:

cache = {0: 0, 1: 1}
def fib(n):
    if n in cache:
        return the cached value
    else:
        calculate fib(n) recursively
        store the value in the cache
        return the value

这种技术称为带有记忆的递归。同样,您可以使用动态编程:从下到上计算值:

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)"

顺便说一句,第n个Fibonacci数有一个闭式表达式,可能证明更快/更有用:

Binet's formula

,其中

definition of phi

答案 1 :(得分:3)

使用timeit模块计时功能:

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

要直接回答标题中的问题,您可以使用time.time()获取自纪元以来的当前时间(以秒为单位),并继续计算随后的斐波纳契数,直到达到时间限制。我选择使用一种有效的方法来计算下面的斐波那契数字,以便更好地展示这一概念。

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

答案 2 :(得分:1)

这是一个使用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