我只是在学习递归,我对该递归函数的输出感到困惑。
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。这是我插入该函数的值,因此在进行所有递归调用之后,该函数是否应该返回与我插入的相同的值?
答案 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 。