C++ 递归函数的渐近时间复杂度

C++ 递归函数的渐近时间复杂度,c++,algorithm,recursion,time-complexity,asymptotic-complexity,C++,Algorithm,Recursion,Time Complexity,Asymptotic Complexity,我被要求开发一个递归函数,然后分析渐近时间复杂度 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 f(N)=0,如果NN1 我们假设: 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

我被要求开发一个递归函数,然后分析渐近时间复杂度

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
f(N)=0,如果NN1
我们假设:

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);

   }

}
//用户输入N1 C1 A1 M1 M2 M3 M4 D1 D2 S1 S2,然后输入ARG
整数递归加(整数参数)
{
如果(ARGn1)
{
返回a1+m1
* 
递归加(m2*ARG/d1-s1)
+ 
m3*递归加(m4*ARG/d2-s2);
}
}
我已经针对讲师的程序测试了我的递归函数,它的工作原理完全相同,所以我继续分析,我遇到了麻烦

我正努力想办法解决这个问题,所以请容忍我

我的部分解决方案尝试:

两次比较(如果ARG a1、m1和m3不重要,因为它们在递归调用之外

a1+m1*u1;=1时间单位(加法)

m1*u=1时间单位(乘法)

将两个递归调用相加是1个时间单位

m3*u=1时间单位(乘法)

根据我们给出的指令,每次都将使用相同的#调用两个递归函数,并且递归函数调用的每个连续数都将小于最后一个数,因为d1=d2>1

因此ARG越大(与n1相比),达到基本情况所需的时间越长,结果也越大。那么算法需要O(ARG)时间


如果有人能让我知道我是否在正确的轨道上,我将不胜感激。谢谢

请注意,在每个递归级别上,您都会调用函数两次。因此,从第一次调用
c1
开始,它将自己调用两次:
c21
c22
,然后从每一次调用开始,它将自己调用两次:
c211
c212
c221
c222
,等等。在每一级递归中,都会有两次以上的调用。在第N级,您将有2^N个调用,因此它的复杂性是指数级的

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

编辑:对不起,我的错。我没有注意到争论有分歧。在这种情况下,不会有N个级别,只有logd(N),其余的正如Tony所写。

递归调用是:

f(N)= A1 + M1*f(M2*N/D1 - S1) Op M3*f(M4*N/D2 - S2), if N > N1

我们有

f(N)= A1 + M1*f(N/D1) Op M3*f(N/D1), if N > N1
递归调用是获得渐近复杂性的关键点,其余的是“just”常量

所以重点是找到T,比如:

T(n)=2*T(n/D)

一旦你找到T(n),你就有了递归的调用次数,因为我们讨论的是渐近复杂性,所以不必担心最后的调用(即
nHuh?这个函数
f(0)=1,f(n)=f(n/2)+f(n/2)
。首先,我的渐近复杂性是否与
f(0)=1,f(n)不同=2f(n/2)
(