递归回溯剪枝之斐波那契数列

求斐波那契数列常用循环和递归2种方式。

通过剪枝优化,可以将递归的时间复杂度进行优化。

可以对比以下三种算法。

import time
from matplotlib import pyplot

#计时器
def timer(func):
    def wrapper(*arg):
        start=time.time()
        func(*arg)
        end=time.time()
        elapsed_time=end-start
        return elapsed_time
    return wrapper

@timer
def fib_for(n):
    if n==1 or n==2:
    return 1
    a=1
    b=1
    for i in range(3,n+1):
        c=a+b
        a=b
        b=c
    return c

#print(fib_for(30))

@timer
def fib_recursion(n):
    if n==1 or n==2:
        return 1
    return fib_recursion(n-1)+fib_recursion(n-2)


visited={}
@timer
def fib_optimize(n):
    if n==1 or n==2:
        return 1
    if n in visited.keys():
        return visited[n]
    else:
        new_value=fib_optimize(n-1)+fib_optimize(n-2)
        visited[n]=new_value
    return new_value

if __name__=="__main__":
    times=[]
    for i in range(1,31):
        times.append(fib_optimize(i))
    x=range(1,31)
    print(times)
    pyplot.plot(x,times)
    pyplot.show()

 

posted @ 2020-08-11 10:08  とうさん  阅读(280)  评论(0编辑  收藏  举报