为什么斐波那契函数的性能时间图不平滑?

时间:2018-10-05 06:28:03

标签: python algorithm

有两个实现斐波那契数列的函数。 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()(递归)时间: fibo_time.png

iterfibo()(迭代)时间: iterfibo_time.png

所以我想知道为什么图形采用这种形式。

2 个答案:

答案 0 :(得分:1)

正如评论中已经指出的那样,iterfibo()的计算时间太小,无法用time()进行精确测量。因此,变化只是由于测量不准确引起的,没有任何意义。

n = 26左右的步进可能是由16位整数转换为32位整数引起的。 F(25)= 46368可以用16位表示,而F(27)= 75025则需要32位整数。

答案 1 :(得分:0)

您描述的用于计算第 n 次斐波那契数的算法并不是最快的。最快的算法(对于大型 n )基于不同的递归公式。由于您可能对算法基础的理论细节不感兴趣,因此,这里有一篇“实用”文章讨论了12种不同算法的Python实现。将这些算法在 n 的不同范围内相互比较,并讨论了结果。您会看到,根据 n 的值,最佳算法会发生变化。

Twelve Simple Algorithms to Compute Fibonacci Numbers