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

C++ 这个递归函数的运行时间是多少?,c++,c,algorithm,recursion,time-complexity,C++,C,Algorithm,Recursion,Time Complexity,我很难计算出这个简单递归函数的运行时间 void myRecur(int n) { if (n < 1) return; cout << n << " "; myRecur(n/2); cout << n << " "; myRecur(n/2); } void myRecur(int n) { 如果(n

我很难计算出这个简单递归函数的运行时间

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

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

  • T(0)=1,因为基本情况做的功是恒定的,并且
  • T(n)=2T(⌊n/2⌋) + 1,因为每个案例对大小为n/2的问题进行两次递归调用,并执行额外的常量工作量

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

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

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

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

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

一旦你知道它打印的内容,你就知道运行时间了,对吗?那么它打印的是什么?我想它打印的是:4 2 1 1 2 1 1 1 2 1 1 1 1 1 1-显然这是当初始
n
为8时,所以你知道
myRecur(8)
调用函数15次,或
2n-1次。如果将初始输入更改为(例如)16、32、64、128,模式是否变得明显(或者,检查代码本身,您能否预测是否会出现这种模式)?如果是这样,你已经找到了答案。至于类似于树遍历-如果人们指望它是一个树遍历来提高效率的话就不是了!@mah谢谢你的输入。你说得对,我可以增加输入的大小,并根据结果猜测运行时间。但是,我正在寻找一种通用方法来分析函数,即使用递归关系或递归树来查找运行时间。@根不同的递归函数有不同的条件,关于它们将如何相对于所提供的输入进行递归。由于这些条件不是泛型的,所以您的解决方案也不是泛型的。非常感谢!只是一个后续问题,对于基本情况,为什么是T(1)=1?我认为它是T(0)=1,因为基本情况发生在n<1时…可能是误解了什么…
cout@PaulHankin这是一个伟大的观点-我以前从未想过!