为什么在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);
}
答案 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)