如何计算此递归的时间复杂度?

时间:2019-03-11 16:23:09

标签: algorithm time-complexity big-o

我对计算以下代码的时间和空间复杂度感兴趣,但是似乎很费劲。我知道递归可以达到的最深深度为n,因此空间应为O(n)。但是我不知道如何计算时间复杂度...当涉及类似于f(f(n-1))这样的形式的递归时,我不知道如何编写公式。 如果是return f3(n-1) + f3(n-1)之类的东西,那我知道它应该是O(2 ^ n),因为T(n)= 2T(n-1)正确吗?

代码如下:

int f3(int n)
{
     if(n <= 2) 
         return 1;
     f3(1 + f3(n-2));
     return n - 1;
} 

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

请注意,对于所有n,f3(n) = n - 1,因此首先计算行f3(1 + f3(n-2)),并返回f3(n-2),然后返回n - 3 = {{1 }}再次计算!
因此,f3(1 + n - 3)两次计算f3(n-2),并产生一些f3(n)开销。
我们得到了一些常数f3(n-2)的递归公式O(1),而T(n) = 2T(n-2) + cc的运行时间。
解决递归,我们得到T(n)