我被要求开发一个递归函数,然后分析渐近时间复杂度。
f(N) = 0, if N < N1
f(N1) = C1
f(N)= A1 + M1*f(M2*N/D1 - S1) Op M3*f(M4*N/D2 - S2), if N > N1
我们假设:
s1 = s2 = 0
m2 = m4 = 1
d1 = d2 > 1
//the user enters N1 C1 A1 M1 M2 M3 M4 D1 D2 S1 S2 and then ARG
int Recursion_Plus(int ARG)
{
if (ARG < n1)
{
return 0;
}
else if(ARG == n1)
{
return c1;
}
else if(ARG > n1 )
{
return a1 + m1
*
Recursion_Plus(m2*ARG/d1 - s1)
+
m3*Recursion_Plus(m4*ARG/d2 - s2);
}
}
我已经针对讲师的程序测试了我的递归函数,它的工作原理完全相同,所以我继续进行分析,但我遇到了困难。
我正在努力解决这个问题,所以请耐心等待。
我尝试部分解决方案:
2 次比较(如果 ARG < N1 并且如果 ARG == N1)需要 1 个单位时间
a1 & m1 & m3 无关紧要,因为它们在递归调用之外
a1 + m1* _ = 1 个时间单位(加法)
m1* _ = 1 个时间单位(乘法)
将 2 个递归调用加在一起是 1 个时间单位
m3* _ = 1 个时间单位(乘法)
根据我们给出的指令,两个递归函数每次都将使用相同的 # 调用,并且递归函数调用的每个连续数字都将小于最后一个,因为 d1 = d2 > 1。
因此,ARG 越大(与 n1 相比),达到基本情况所需的时间越长,结果也会越大。所以算法需要 O(ARG) 时间?
如果有人能让我知道我是否走在正确的轨道上,我将不胜感激。谢谢