Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 为什么递归斐波那契方法的计时数据中存在斐波那契模式?_Recursion_Fibonacci_Timing - Fatal编程技术网

Recursion 为什么递归斐波那契方法的计时数据中存在斐波那契模式?

Recursion 为什么递归斐波那契方法的计时数据中存在斐波那契模式?,recursion,fibonacci,timing,Recursion,Fibonacci,Timing,我第一次注意到这种模式是在我的动态编程与递归的课堂演讲中。在第7个斐波那契数附近,可以看到斐波那契模式。对此有什么解释吗 我决定复制数据,并注意到了模式。 以下是我的实验代码: 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()

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

我决定复制数据,并注意到了模式。 以下是我的实验代码:

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 
导入时间
def纤维(n):

如果(n发生这种情况的原因是由于斐波那契循环中的递归调用

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)调用中运行得稍快


*在达到某个fibonnaci数之前,可能看不到该模式。这取决于时间测量的精度。例如,如果以秒为单位进行测量,并且刚好达到小数点后一位(即10分之一秒),则模式将不会出现,直到您通过0.0秒的配置文件。

使用递归实现,运行时间以n为单位增长,就像斐波那契数一样,并且它们呈指数增长(例如)。递归方法的运行时间呈指数增长。