fibonacci--python实现

fibonacci是比较经典的递归,但是递归的效率相当低。以下是传统的递归算法:

#!/usr/bin/python
Tasknum = 0
def fib(n):
    global Tasknum
    Tasknum += 1
#    print "fib(%d) is run" % n
    if n < 2: return 1
    else: return fib(n - 1) + fib(n - 2)

if __name__ == "__main__":
    import sys
    import time
    startTime = time.clock()
    print fib(int(sys.argv[1]))
    endTime = time.clock()
    print endTime - startTime
    print Tasknum

    在传统的递归方法中,可以发现,我们做了很多重复的计算。去掉代码中的注释,可以看到函数fib()调用的次数。有种方法,在脚本语言中可以通用,就是将计算过的保存起来,下次用的时候不用计算,直接使用就过就好了。貌似叫什么动态编程吧,其实就是使用了一段内存空间保存了需要重复利用的值,用消耗空间的方式取代了时间的消耗。


#!/usr/bin/python
Tasknum = 0
def fib1(n, memo):
    global Tasknum
    Tasknum += 1
#    print "fib(%d) is run" % n
    if n not in memo:
        memo[n] = fib1(n - 1, memo) + fib1(n - 2, memo)
    return memo[n]

def fib(n):
    memo = {0:0, 1:1}
    return fib1(n, memo)

if __name__ == "__main__":
    import sys
    import time
    startTime = time.clock()
    print fib(int(sys.argv[1]))
    endTime = time.clock()
    print endTime - startTime
    print Tasknum

其实就是增加了一个字典,来保存了曾经使用过的值。

你可能感兴趣的:(fibonacci--python实现)