如何找到以下算法的复杂性:
@app.route("/goo")
//do something
正确的递归方程int f(int n)
{
if(n<=1) { return 1; }
return f(n-1) + f(n-1);
}
是否正确?怎么解决?
答案 0 :(得分:1)
我认为你的递归方程是正确的。
但是这个具体案例很容易,只需要思考&#34;关于它有点不进一步进入&#34;如何解决一般的递归&#34;。
让我们来看看f(3)
f(3)
f(2) + f(2)
f(1) + f(1) + f(1) + f(1)
那么,我们有多少次电话? 1 + 2 + 4
嗯...... f(4)怎么样?
f(4)
f(3) + f(3)
f(2) + f(2) + f(2) + f(2)
f(1) + f(1) + f(1) + f(1) + f(1) + f(1) + f(1) + f(1)
那么,我们有多少次电话? 1 + 2 + 4 + 8
所以我们可以对n = 5:1 + 2 + 4 + 8 + 16进行有根据的猜测。如果你考虑一下,它也有意义,因为:numCalls(f(5))= 2 * numCalls(f(4))+ 1(+ 1源于对f(5)本身的调用)。
我们可以概括为
T(n) = sum(2^i) for i in (0, n-1)
现在,如果我们使用
这一事实sum(2^i) for i in (0, n-1) == 2^n - 1
很明显
T(n) = 2^n - 1
位于O(2^n)
离开练习:
通过归纳证明
T(n) = 2*T(n-1) + 1 <=> T(n) = 2^n - 1
或者更一般:
T(n) = 2*T(n-1) + c <=> T(n) = c*(2^n - 1)
正如评论中建议的旁注:您可以使用memoization
大幅改善效果