假设递归函数的递归关系

时间:2015-01-27 11:32:07

标签: algorithm recursion time-complexity

找到递归程序的时间复杂度的方法是什么? 我们以此代码为例。

int hypo(int a, int n) 
{ 
     if(n == 1) 
         return 0; 
     else 
         return a + hypo(a,n-1) * hypo(a,n-1); 
}

2 个答案:

答案 0 :(得分:1)

这种形式的大多数简单问题都可以通过主定理来解决。请参阅http://en.wikipedia.org/wiki/Master_theorem

对于更复杂的问题,存在更复杂的方法。 : - )

答案 1 :(得分:1)

你要做的第一件事是写出指定运行时间的等式(这通常是直截了当的,并不涉及任何解决)。在您的示例中,您通过f(a, n)表示参数an的函数的运行时间,然后:

  • 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)似乎很容易(您可以通过归纳证明公式,或者只是说"它很明显")。