我一直在努力让Fibonacci序列中的每个数字写入一个文件,我知道有些东西我做错了,但我无法确定它。有更有效的方法吗?任何帮助表示赞赏。
import sys
import os
import time
known = {0:0, 1:1}
def fibonacci_slow(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci_slow(n-1) + fibonacci_slow(n-2)
def fibonacci_fast(n):
f = open('fib500.txt', 'w')
if n in known:
return known[n]
res = fibonacci_fast(n-1) + fibonacci_fast(n-2)
print res
if fibonacci_fast:
f.write(res)
known[n] = res
return res
def main():
time_start = time.time()
print fibonacci_slow(10)
time_end = time.time()
print "Time for slow fibonacci to complete ", time_end - time_start
time_start = time.time()
print fibonacci_fast(500)
time_end = time.time()
print "Time for fast fibonacci to complete ", time_end - time_start
if __name__ == '__main__':
main()
答案 0 :(得分:1)
您需要将文件写入fibonacci_fast方法的文件中。每次调用它时,它都会重新打开文件,因为您没有关闭它,所以无法保证它会被写入文件。
至于速度,递归不适合您的计算。您不需要递归调用:
res = fibonacci_fast(n-1) + fibonacci_fast(n-2)
因为您可能已经提出了这些调用的返回值。最好从一开始就开始工作,直到达到你想要的值,而不会遭受这种递归造成的开销。换句话说,采用迭代方法会更快。
正如您可能试图表明的那样,在速度/优化意义上,在Fibonacci序列中生成第n个数字不是递归的良好候选者。
如果您将fibonacci_fast更改为:
def fibonacci_fast(n):
known = [0, 1]
count = 0
for i in range(n):
newNum = known[0] + known[1]
known[0] = known[1]
known[1] = newNum
return known[0]
并运行测试脚本:
def main():
time_start = time.time()
print fibonacci_slow(20)
time_end = time.time()
print "Time for slow fibonacci to complete ", time_end - time_start
time_start = time.time()
print fibonacci_fast(20)
time_end = time.time()
print "Time for fast fibonacci to complete ", time_end - time_start
你得到:
6765
Time for slow fibonacci to complete 0.0043318271637
6765
Time for fast fibonacci to complete 0.00010085105896
并将其写入文件,您可以添加一个可以写入的文件参数:
def fibonacci_fast(n, f):
known = [0, 1]
for i in range(n):
newNum = known[0] + known[1]
known[0] = known[1]
known[1] = newNum
f.write(str(known[0]) + " ")
return known[0]
并称之为:
f = open("fib.txt", "w")
fibonacci_fast(20, f)
f.close()
或更'pythonic'的方式(这有点快):
with open("fib.txt", "w") as f:
fibonacci_fast(20, f)
如果您尝试在序列中生成第500个数字,您可以看到递归和迭代方法之间的巨大差异。它需要几分钟(如果不是几小时,我还没有等待它)来完成递归函数,但只需要一小部分时间来完成迭代方法,即使将其写入文件也是如此。
有关斐波那契序列的更多信息,请参见here.
答案 1 :(得分:0)
你的递归有点笨拙,很多次重新计算每个数字。这是一个经典问题,这种迭代算法可行:
def fib2file(n, fname):
with open(fname, 'w') as of:
f1, f2, f3 = 0, 1, 0
for _ in range(n):
f1 = f2
f2 = f3
f3 = f1 + f2
of.write('%d\n' % f3)