这个递归函数的运行时间是多少?

时间:2016-03-06 18:23:37

标签: c++ c algorithm recursion time-complexity

我很难搞清楚这个简单的递归函数的运行时间。

void myRecur(int n)
{
   if (n < 1) return;
   cout << n << " ";
   myRecur(n/2);
   cout << n << " ";
   myRecur(n/2);
}

我认为它打印:4 2 1 1 2 1 1 4 2 1 1 2 1 1 for myRecur(4)。

此外,就时间复杂度而言,此函数是否与树遍历函数类似?

非常感谢任何有关理解递归和详细解释此特定问题的运行时间的建议。

2 个答案:

答案 0 :(得分:2)

这是使用递归关系的好地方!让我们让T(n)为算法在大小为n的输入上运行所花费的时间。然后

  • T(0)= 1,因为基本情况的工作量恒定,
  • T(n)= 2T(⌊n/2⌋)+ 1,因为每个其他情况都会对大小为n / 2的问题进行两次递归调用,并进行额外的恒定工作量。

现在的目标是找到某种非递归描述T(n)的表达式。有很多方法可以做到这一点。查找迭代方法和递归树方法以获取此示例。最快的方法是使用奇妙命名的主定理,它允许您直接从递归关系中确定时间复杂度。在这种情况下,主定理说这解决了T(n)=Θ(n)。

答案 1 :(得分:1)

我认为您对最坏情况感兴趣,因此代码复杂度为Ο(n)。对于给定的 n ,您的函数最多会运行 2n-1 次。

为了更好地理解,请尝试构建一个调用树。

            n
    n/2           n/2
n/4    n/4     n/4    n/4
...

有⌊ log 2 (n)⌋级别。每个级别都有 2 lvl 项。项目总数 2n - 1