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

标签 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);
}

最佳答案

将递归函数想象成树中的计算值。

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

如果您仔细查找 n = 2,则有 3 个值需要计算,即 2^(1+1) - 1 = 3 这里的 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 )

因此你得到 O(2^n)

关于java - 简单循环时间复杂度内的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57482860/

相关文章:

algorithm - 确定算法,用于计算线段从圆的内部到外部交叉的圆与圆相交的点

algorithm - 将整数数组编码为短字符串

java - 如何列出 Java 类及其祖先在 Eclipse 中公开的所有属性?

java - 将整数数组列表转换为基于ascii表的字符串并与字符串进行比较

java - Eclipse 想要构造函数中的类吗?

java - 不使用ajax以编程方式搜索google

java - 在 Java 中将字符从扫描仪转换为十进制和十六进制

string - 可能的字符串匹配的数据结构

javascript - 普通函数或箭头函数能否以递归方式从其主体调用自身?

c++ - C++11 中使用模板参数的递归可变参数 void 函数