将Fibonacci序列写入文件Python?

时间:2013-11-09 03:08:38

标签: python

我一直在努力让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()

2 个答案:

答案 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)