我需要一个代码来计算第n个斐波纳契数,并在python中给我时间来计算它。
def fib(n):
if n==0 or n==1: return 1
else: return fib(n-1)+fib(n-2)
数字步骤的计算必须使用这样的方法。
答案 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数有一个闭式表达式,可能证明更快/更有用:
,其中
答案 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