Math 双递归函数的时间复杂度

Math 双递归函数的时间复杂度,math,recursion,time-complexity,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)就会伤到我的头。让我们先写出一个呼叫总数的重复关系: T(0)=T

这就是代码:

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)就会伤到我的头。

让我们先写出一个呼叫总数的重复关系:

  • 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=21-1
  • T(4)=3=22-1
  • T(6)=7=23-1
  • T(2n)=2n-1
如果n是偶数,我们有T(n)=2n/2-1=(√2) 你可以用归纳法证明这一点

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

  • 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)=2n-1

如果n是偶数,那么T(n)=2(n-1)/2-1。同样,你可以通过归纳来证明这一点,如果你愿意的话。

你知道,你可以通过将
返回测试(n-2)*test(n-2)
更改为
{int y=test(n-2);返回y*y;}
?一个简单的更改就可以将一个O(2^n)函数转换为O(n)功能。