为什么递归Fibonacci方法的时序数据中存在Fibonacci模式?

时间:2017-05-10 01:24:30

标签: recursion fibonacci timing

我首先在动态编程与递归讲座的课堂演示中注意到了这种模式。在第7个斐波那契数字附近,可以看到斐波那契模式。对此有什么解释吗?

Timing data for recursive Fibonacci method The lecture presentation can be found here:

我决定重现数据并注意到模式。 这是我的实验代码:

import time

def fib(n):
    if(n <= 2):
        return 1
    else:
        return fib(n - 1) + fib(n - 2)

for i in range(0, 100):
    start = time.time()
    print "fib(", i,") = ", fib(i), " with time: ", time.time() - start 

data

1 个答案:

答案 0 :(得分:1)

发生这种情况的原因是由于斐波那契复发中的递归调用。

f(n) = f(n-1) + f(n-2)

我们假设以下内容:

f(n-1) takes X seconds to calculate

f(n-2) takes Y seconds to calculate. 

Therefore, f(n) will take X + Y seconds to calculate since f(n) = f(n-1) + f(n-2)

现在,如果我们考虑接下来的几个斐波纳契数字:

f(n+1) = f(n) + f(n-1)

f(n+1) will take X + Y seconds + X seconds = 2X + Y seconds

// f(n+2) = f(n+1) + f(n)
f(n+2) will take 2X + Y + X + Y seconds = 3X + 2Y seconds

现在,让我们加上一些实数来更好地证明这一点。

我们假设以下内容:

n = 10

f(9) takes 5 seconds to calculate

f(8) takes 3 seconds to calculate

在这种情况下:

f(10) will take 5 + 3 = 8 seconds to calculate

f(11) will take 5 + 3 + 5 = 2(5) + 3 = 13 seconds to calculate

f(12) will take 2(5) + 3 + 5 + 3 = 3(5) + 2(3) = 21 seconds to calculate

其他一些注意事项

*实际运行的时间并不总是与预期模式一样精确。如果您查看以下输出,甚至可以从您的数据中看到这一点:

fib( 43 ) =  433494437  with time:  62.495429039
fib( 44 ) =  701408733  with time:  101.303709984
fib( 45 ) =  1134903170  with time:  161.135010004

161.135010004小于(62.495429039 + 101.303709984)

这可能是因为fib(43)在fib(45)调用中运行得稍快,然后它在fib(44)调用中运行。

*在达到某个斐波那契数字之前,可能看不到该模式。这取决于您的时间测量的精确度。例如,如果您在几秒钟内测量并且只是一个小数点(即十分之一秒),那么在您通过0.0秒的配置文件之前,模式将不会出现。