简单循环时间复杂度内的递归函数

时间:2019-08-13 17:42:23

标签: java algorithm recursion

为什么在for循环内调用递归函数会导致时间复杂度为 O(2 ^ N)而不是 O(N 2 ^ N)下面的代码。以《 CTCI》为基础。

void allFib(int n){
    for (int i = 0; i < n; i++) {
        System.out.println(i + ":  "+  fib(i)); 
    }
}

int fib(n){
    if  (n  <=  0)  return 0;
    else if  (n  ==  1)  return 1; 
    return fib(n - 1)  +  fib(n -2);
}

1 个答案:

答案 0 :(得分:2)

将递归函数视为计算树中的值。

        fib(n)
         /\
        /  \
 fib(n-1)   fib(n-2)

如果您仔细查看n = 2,将有3个要计算的2^(1+1) - 1 = 3值,其中1就是{{1 }}

对于2^(h+1)-1,高度为n = 3

对于h = 2,高度为n = 4

对于所有h = 3,您需要添加所有这些内容: n->的顺序为2^2 - 1 + 2^3 - 1 + 2^4 - 1 + ....2^n - 1

因此,您得到2^(n+1)