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的问题有两个递归调用
- 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
- T(2)=1=21-1
- T(4)=3=22-1
- T(6)=7=23-1
- T(2n)=2n-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)=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)功能。