找到递归程序的时间复杂度的方法是什么? 我们以此代码为例。
int hypo(int a, int n)
{
if(n == 1)
return 0;
else
return a + hypo(a,n-1) * hypo(a,n-1);
}
答案 0 :(得分:1)
这种形式的大多数简单问题都可以通过主定理来解决。请参阅http://en.wikipedia.org/wiki/Master_theorem。
对于更复杂的问题,存在更复杂的方法。 : - )
答案 1 :(得分:1)
你要做的第一件事是写出指定运行时间的等式(这通常是直截了当的,并不涉及任何解决)。在您的示例中,您通过f(a, n)
表示参数a
和n
的函数的运行时间,然后:
f(a, n)
并不依赖a
,所以让我们将其f(n)
改为f(1)
是一个常数;让我们通过k
n > 1
,则f(n) = c + 2 * f(n-1)
,其中c
是常数(另一个)所以现在你需要找出满足方程f(n) = c + 2 * f(n-1)
和f(1) = k
的函数。没有一般方法,但在您的情况下,它很容易计算f(2)
,f(3)
,...:
f(2) = c + 2 * f(1) = c + 2 * k
f(3) = c + 2 * f(2) = 3 * c + 4 * k
f(4) = c + 2 * f(3) = 7 * c + 8 * k
f(5) = c + 2 * f(4) = 15 * c + 16 * k
从这里找到f(n)
似乎很容易(您可以通过归纳证明公式,或者只是说"它很明显")。