public static long A (int N) {
if (N <= 1)
return 1;
return N + A(N-1) + A(N-2);
}
这是我的方法:堆栈将有N-1 + N-2个呼叫。这只是N + N而且是2N。
然而答案是2 ^ N.我不太明白。
答案 0 :(得分:1)
这是一种非正式的思考方式。
假设N = 10。然后进行2次调用,一次调用N = 9,另一次调用N = 8。对于每一个,也将进行2次调用,对于N = 9,一个到N = 8和N = 7,对于N = 8,一个到N = 7,N = 6。
因此,每当N增加1时,调用次数乘以2.
因此,O(2 ^ N)是正确的。
答案 1 :(得分:1)
对A
的每次调用最多会产生2
次A
次调用,N=1
的基本情况会产生不变成本。总的来说,对A
的调用最多会创建一个高度为N
的完整二叉树,其中
sum_{i=0}^{N}2^i = 2^{N+1}-1 in O(2^{N})
节点。更正式地说,运行时绑定可以通过归纳证明获得。
答案 2 :(得分:1)