双递归函数的时间复杂度

时间:2016-01-09 17:57:05

标签: math recursion time-complexity

所以这就是代码:

int test ( int n) 
{ 
   if (n ≤2) return 1; 
   else return test(n-2) * test(n-2); 
} 

我对如何推理这种递归函数没有信心。我尝试将N值映射到递归深度,如下所示:

N = 2 -> 0 recursions
N = 4 -> 2
N = 8 -> 14

但说实话,我不确定这会让我在任何地方(只是考虑测试(16)会伤害我的头脑。

1 个答案:

答案 0 :(得分:2)

让我们首先写出所做调用总数的递归关系:

  • T(0)= T(1)= T(2)1,因为有一个总呼叫(初始呼叫)。
  • T(n + 2)= 2T(n)+ 1,因为有一次调用初始调用,加上两次递归调用大小为n的问题。

让我们先看看n是偶数的情况。然后

  • T(0)= 1
  • T(2)= 1
  • T(4)= 2T(2)+ 1 = 3
  • T(6)= 2T(4)+ 1 = 7
  • T(8)= 2T(6)+ 1 = 15
  • T(9)= 2T(8)+ 1 = 31

除了0的情况之外,看起来这些值采用模式1,3,7,15,31等。请注意,这些值中的每一个都小于2的幂:1 = 2 - 1, 3 = 4 - 1,7 = 8 - 1等我们可以猜测我们所看到的与2的幂有关。

回到我们的序列,我们可能会猜测

  • T(2)= 1 = 2 1 -1
  • T(4)= 3 = 2 2 -1
  • T(6)= 7 = 2 3 -1
  • ...
  • T(2n)= 2 n - 1

因此,如果n是偶数,我们有T(n)= 2 n / 2 - 1 =(√2) n - 1.你可以使用它来形式化通过归纳证明。

对于奇怪的情况,我们基本上得到了相同的东西:

  • T(1)= 1
  • T(3)= 2T(1)+ 1 = 3
  • T(5)= 2T(3)+ 1 = 7
  • T(7)= 2T(5)+ 1 = 15
  • T(9)= 2T(7)+ 1 = 31
  • ...
  • T(2n + 1)= 2 n -1

因此,如果n是偶数,那么T(n)= 2 (n-1)/ 2 - 1.再次,你可以通过归纳来证明这一点,如果你做了正式的事情。等。