基本思路:以递归与非递归实现斐波拉契数列,用timeit记录时间,然后绘制图像分析。
参考代码:
from timeit import Timer
from matplotlib import pyplot as plt
#递归
def func1(n):
if n==0:
return 0
if n==1:
return 1
return func1(n-1)+func1(n-2)
# 非递归
def func2(n):
if n==0:
return 0
if n==1:
return 1
a = 0
b = 1
for i in range(2, n):
t = b
b = a + b
a = t
return b
n=eval(input())
print(func1(n-1))
print(func2(n))
#测试消耗时间
Time1=[]
Time2=[]
for i in range(0,33):
t1 = Timer(stmt="func1(%d)" % i, setup="from __main__ import func1")
t2 = Timer(stmt="func2(%d)" % i, setup="from __main__ import func2")
Time1.append(t1.timeit(10))
Time2.append(t2.timeit(10))
plt.title("digui_func1 and feidihui_func2")
plt.xlabel("n")
plt.ylabel("time")
plt.plot(list(range(0,33)),Time1,'ro')
plt.plot(list(range(0,33)),Time2,'bo')
plt.legend(["digui_func1","feidigui_func2"])
plt.show()
实验结果:
实验结论:
从得出图像可以看出递归的消耗时间是呈指数级别增长的,时间复杂度较大,但代码少,以较易理解,在数据少的情况下可以使用递归,如果数据庞大,递归就相当费时间了,就不建议使用递归。而非递归的时间复杂度比递归少很多,可以对较大的数据的实现,缺点在于代码不易于理解,代码量很大。在实际开发中,要根据数据量判断是否使用递归和非递归。