Algorithm 假设递归函数的递推关系

Algorithm 假设递归函数的递推关系,algorithm,recursion,time-complexity,Algorithm,Recursion,Time Complexity,计算递归程序时间复杂度的方法是什么? 让我们以这段代码为例 int hypo(int a, int n) { if(n == 1) return 0; else return a + hypo(a,n-1) * hypo(a,n-1); } 这种形式的大多数简单问题都可以用主定理来解决。看 对于更复杂的问题,存在更复杂的方法。:-) 您必须做的第一件事是编写指定运行时间的方程式(这通常很简单,不涉及任何求解)。在您的示例中,用

计算递归程序时间复杂度的方法是什么? 让我们以这段代码为例

int hypo(int a, int n) 
{ 
     if(n == 1) 
         return 0; 
     else 
         return a + hypo(a,n-1) * hypo(a,n-1); 
}

这种形式的大多数简单问题都可以用主定理来解决。看


对于更复杂的问题,存在更复杂的方法。:-)

您必须做的第一件事是编写指定运行时间的方程式(这通常很简单,不涉及任何求解)。在您的示例中,用
f(a,n)
表示参数
a
n
的函数运行时间,然后:

  • f(a,n)
    不依赖于
    a
    ,所以让我们编写它
    f(n)
  • f(1)
    是一个常数;让我们用
    k
  • 如果
    n>1
    ,则
    f(n)=c+2*f(n-1)
    ,其中
    c
    是一个常数(另一个)
现在你需要找出哪个函数满足方程
f(n)=c+2*f(n-1)
f(1)=k
。没有通用方法,但在您的情况下,很容易计算
f(2)
f(3)
,…:

f(2) = c + 2 * f(1) =      c +  2 * k
f(3) = c + 2 * f(2) =  3 * c +  4 * k
f(4) = c + 2 * f(3) =  7 * c +  8 * k
f(5) = c + 2 * f(4) = 15 * c + 16 * k

从这里很容易找到
f(n)
(你可以通过归纳证明公式,或者说“这很明显”)。

计算出执行
hypo
(无递归调用)一次的成本,并计算出递归调用该方法的次数。一般来说,你必须按照@MAV所说的做,但是你的例子很糟糕,不是返回hypo(a,n-1)*hypo(a,n-1)只是找到b=hypo(a,n-1);返回b*2。您的代码必须具有可怕的时间复杂度2^n,但如果您喜欢我所说的,它不仅是多项式,而且是线性的;)基本上,对于您的代码,获取hypo(a,n)的时间就是获取hypo(a,n-1)两次的时间。也就是说,t(a,n)=2*t(a,n-1)同样,t(a,1)基本上是1,从这里你可以得到complexity@piotrekg2我不同意阿里·阿米里的评论和否决票。你应该取消删除你的答案-它实际上回答了问题,给出了一个很好的递归关系,并提到了如何加速它。主定理在这里并不实际适用。重复出现的形式错误。