【发布时间】:2016-03-06 18:23:36
【问题描述】:
我很难弄清楚这个简单递归函数的运行时间。
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)。
另外,这个函数在时间复杂度方面是否类似于树遍历函数?
非常感谢任何有关理解递归的建议和对此特定问题的运行时间的详细解释。
【问题讨论】:
-
一旦你知道它打印了什么,你就知道运行时间了,对吧?那么它打印什么?
-
我认为它会打印: 4 2 1 1 2 1 1 4 2 1 1 2 1 1 - 显然这是初始
n为 8 时,所以你知道myRecur(8)调用了这个函数 15 次,或者2n-1次。如果您将初始输入更改为 16、32、64、128,模式是否变得明显(或者,检查代码本身,您能否预测是否会出现这种模式)?如果是这样,您已经找到了答案。至于类似于树遍历 - 如果它是人们指望效率的树遍历,则不是! -
@mah 感谢您的意见。你是对的,我可以增加输入的大小并根据结果猜测运行时间。但是,我正在寻找一种通用的方法来分析函数,即使用递归关系或递归树来查找运行时间。
-
@root 不同的递归函数有不同的标准,它们将如何根据提供的输入进行递归。由于这些标准不是通用的,因此您的解决方案也不是通用的。
标签: c++ c algorithm recursion time-complexity