求斐波那契数列常用循环和递归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()