我用grepper和在寻找递归函数示例时找到了这段代码片段。 我理解了更新的部分,函数如何调用自己-1直到它到达基本情况,然而,我不理解else中的最后一行。 我只是想弄清楚最后一行是如何让数字恢复到起始值的。 代码中没有任何东西将它设置为+1,而且,当它返回时,它是调用函数本身,还是只是一个我不知道的规则? 我只是想弄清楚这里的逻辑。
void PrintTest(int test)
{
if (test < 1)
{
return; // Exit condition, known as "base case"
}
else
{
cout << test << " ";
PrintTest(test-1);
cout << test << " ";
}
}
int main()
{
int a;
cout << "Enter a number prefarably between 2 and 9: ";
cin >> a;
PrintTest(a);
我知道这可能是一个愚蠢的问题,但我只是试图理解为什么“cout<
它并不是“增加数字回来”。
在递归步骤之后,处理将从停止的地方继续。 所以您只是看到“较低”的堆栈帧完成了它们的处理。
下面是事件的顺序,从上到下:
PrintTest(3) PrintTest(2) PrintTest(1) PrintTest(0)
===============================================================================
cout << 3 << " ";
PrintTest(3-1); cout << 2 << " ";
PrintTest(2-1); cout << 1 << " ";
PrintTest(1-1); return;
cout << 1 << " ";
cout << 2 << " ";
cout << 3 << " ";
考虑一下这个更简单的情况:
void foo(int x) {
std::cout << x << '\n';
bar(x-1);
std::cout << x << '\n';
}
我想您可以预测例如foo(3)
的输出:
3
... any output from bar(2) comes here ...
3
现在将bar
替换为foo
,并为递归添加一个停止,您将得到与printtest
相同的结果。