递归斐波纳契的复杂性和步骤数

时间:2017-01-01 12:20:32

标签: c++ c++11 fibonacci

我的任务是对递归斐波那契算法进行分析。该算法具有O(2 ^ n)复杂度。我已经读过n是深度,而在另一篇文章中,n是2 ^ n的输入大小。那么真相是什么?然后如何计算步数(也许我们也可以称之为递归调用)来获得斐波那契数。我有这样的代码:

#include <bits/stdc++.h>

using namespace std;

long fibonacci(long);

long jl=0;
double rt;

int main(){
    long result, number;

    scanf("%ld", &number);
    clock_t mulai = clock();
    result = fibonacci(number);
    rt =  ((double) (clock() - mulai)) / CLOCKS_PER_SEC;
    printf("Fibonacci (%ld) = %ld\n", number, result);
    printf("Jumlah langkah = %ld\n", jl);
    printf("Running Time = %.10f\n", rt);
    return 0;
}

long fibonacci(long n){
    jl++;
    if(n==0 || n==1)
        return n;
    else
        return fibonacci(n-1) + fibonacci(n-2);
}

这段代码中的jl是步数(递归调用)。这些是我的计算示例:

F(1),JL = 1

F(2),JL = 3

F(3),JL = 5

F(5),JL = 15

那么,这是真是假?如果为false什么是正确的代码?谢谢。

1 个答案:

答案 0 :(得分:2)

这里的想法是,如果你要求实例fibonacci(3),你将需要进行一些递归调用。要想象我们可以绘制树,fibonacci(3)调用fibonacci(3 - 1)fibonacci(3 - 2)等。

            fibonacci(3)   
             /      \
      fibonacci(2)  fibonacci(1)
       /      \
fibonacci(0) fibonacci(1)

如果您需要计算fibonacci(4)树成为

                     fibonacci(4)
                     /           \
            fibonacci(3)          fibonacci(2)
             /      \               |         \
      fibonacci(2)  fibonacci(1)  fibonacci(1) fibonacci(0)
       /      \
fibonacci(0) fibonacci(1)

你可能已经发现了模式,在最深处,树的深度为n。而节点数在O(2 ^ n)。

也就是说,如果你正在执行该函数,你将最多递减n级,但仍然执行~2 ^ n次函数调用。