c++ - 对 C++ 中的基本递归感到困惑

标签 c++ recursion

void print(int p)
{
    if (p==0)
    {
       return;
    }

    print(p-1);
    cout<<p;
    return;
}

这是一个基本函数,它从您输入的任何数字开始计数,因此如果您发送 6,它会打印 123456。

我已经盯着它看了半个小时了,但我不明白它是如何工作的。为什么递归调用 print(p-1); 不直接导致语句 if(p==0) 并在到达 cout<<p 之前返回?

cout<<p 是如何被访问的?我完全理解在递归调用之前放置 cout<<p; 并改为打印 654321 时它是如何工作的。

最佳答案

您似乎认为 return 总是返回到 main(或您调用 print 的任何地方),和/或递归调用会替换自身。这不是真的。

如果您调用 print(6),它当然会以 if 开头,然后继续 print(p-1);。此时开始调用print(5),但之前的print(6)仍然存在并等待print(5) 完成。

print(5) 做同样的事情,导致调用 print(4)print(5) 等待 打印(4)。等等……

在某个时候,print(1) 调用 print(0)if 立即在另一个 之前结束该函数print 被调用。现在,当 print(0) 结束时,print(1) 继续其代码,即 cout。之后,print(1) 结束,导致 print(2) 继续其工作,依此类推......

最后,当 print(5) 结束时,最顶层的嵌套调用 (print(6)) 继续,并且在 cout 在其中,它可以返回到 main(或从其他调用它的地方)。

关于c++ - 对 C++ 中的基本递归感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46748823/

相关文章:

c++ - 临时对象上的 std::transform

c++ - 如何在 C++ 中动态创建新的二维数组

java - 如何递归地找到直方图中的最大矩形面积?

python - 递归地按键对嵌套的 OrderedDict 进行排序

c++ - 在 C++ 中自动化控制台输入

c++ 使用 *& 作为参数(指针乐趣,三级树方法)

c - 数组元素乘法的二叉树方法

JavaScript:如何在它们的功能之外循环遍历这些项目?

c++ - 使用 std::unique 和 vector.erase 删除除了最后一次出现的所有重复元素

c - 使用 fgets 获取输入并使用递归反向输出答案