对该递归函数的输出感到困惑

时间:2020-02-24 23:23:17

标签: c++ recursion

我只是在学习递归,我对该递归函数的输出感到困惑。

int Run(int x)
{
    if (x > 0)
        cout << Run(x - 1) << " ";
    return x;
}

如果我使用Run(5)调用此函数,则会得到输出:0 1 2 3 4

我希望得到输出:0 1 2 3 4 5。

我很困惑为什么在输出末尾没有返回5。这是我插入该函数的值,因此在进行所有递归调用之后,该函数是否应该返回与我插入的相同的值?

3 个答案:

答案 0 :(得分:1)

Run确实返回5,但是对Run recursive 调用却从不执行,仅打印递归调用的返回。

这样思考:您不会打印给x的每个Run;您只打印递归调用的返回。第一次进行递归调用的Run调用返回您希望打印的5。

答案 1 :(得分:0)

基本上,索引0表示您的函数将被执行n次,其中n =参数整数加1。事物cout << Run(x - 1) << " ";将被执行n-1次。这是因为第一个函数调用一旦执行了所有其他递归调用,将返回其x值。但是由于它没有将其返回到先前的递归调用,该调用随后会指出该值,因此不会显示该值。 在您的主要功能上尝试使用此cout << Run(int x)

答案 2 :(得分:0)

我们可以看到 Run(n)是一个打印小于 n 的非负整数并返回 n 的函数。这意味着对于 Run(n),如果 n 为正,您将得到 0 1 2 ... n-1 的输出。

您在这里拥有什么

cout << Run(x - 1) << " ";

相同
int r = Run(x - 1);
cout << r << " ";

也就是说, Run(x-1)将打印小于 x-1 的数字并返回 x-1 。因此,如果 x == 5 表示 Run(x-1)打印从 0 x-2 和 r 设置为 4 。然后该函数将打印 r 并返回。如果您仍然感到困惑,也可以这样做:

Run(x - 1);
cout << x-1 << " ";

由于我们知道 Run(x-1)将始终返回 x-1 ,因此我们可以跳过将其存储在变量中并直接打印的方法。分析递归函数时的一个技巧就是假设它们起作用-假设 Run(x-1)成功将数字从 0 打印到 x-2 -接下来要做的就是打印 x-1

因此,如您所见,变量 x 从不打印,仅打印小于它的数字。该函数返回 5 ,但从不打印它。

如果您希望它打印小于或等于等于 x 的非负整数,请进行以下修改:

int Run(int x) {
  if (x >= 0) {
    cout << Run(x-1)+1 << " ";
  }
  return x;
}

if语句已更改为包括现在正在打印的 0 Run(x-1)打印从 0 x-1 的数字,并返回 x-1 ,因此在结果中添加 1 可以打印 x