有两个实现斐波那契数列的函数。 fibo()
是递归样式,iterfibo()
是使用循环方法实现的。
我比较了两个功能的执行时间。
import matplotlib.pyplot as plt
import time
# iteration style
def iterfibo(count):
if count <= 1 :
return count
left, right = 0, 1
for i in range(count - 1):
temp = left + right
left = right
right = temp
return temp
# recursion style
def fibo(n):
if n <= 1:
return n
return fibo(n - 1) + fibo(n - 2)
length = [x for x in range(25)]
iterfibo_time = []
fibo_time = []
for i in length:
# fibo's execution time
ts = time.time()
fibo(i)
fibo_time.append(time.time() - ts)
# iterfibo's execution time
ts = time.time()
iterfibo(i)
iterfibo_time.append(time.time() - ts)
plt.plot(length, iterfibo_time)
plt.show()
但是,我想知道iterfibo()
的图形不是平滑曲线。而且在某些情况下,执行时间会减少而不是增加。
fibo()
(递归)时间:
iterfibo()
(迭代)时间:
所以我想知道为什么图形采用这种形式。
答案 0 :(得分:1)
正如评论中已经指出的那样,iterfibo()
的计算时间太小,无法用time()
进行精确测量。因此,变化只是由于测量不准确引起的,没有任何意义。
n = 26左右的步进可能是由16位整数转换为32位整数引起的。 F(25)= 46368可以用16位表示,而F(27)= 75025则需要32位整数。
答案 1 :(得分:0)
您描述的用于计算第 n 次斐波那契数的算法并不是最快的。最快的算法(对于大型 n )基于不同的递归公式。由于您可能对算法基础的理论细节不感兴趣,因此,这里有一篇“实用”文章讨论了12种不同算法的Python实现。将这些算法在 n 的不同范围内相互比较,并讨论了结果。您会看到,根据 n 的值,最佳算法会发生变化。