c++ - 限制 C++ 中的递归调用(大约 5000 次)?

标签 c++ recursion

为了了解 C++ 中递归调用的限制,我尝试了这个函数!

void recurse ( int count ) // Each call gets its own count
{
printf("%d\n",count );
  // It is not necessary to increment count since each function's
  //  variables are separate (so each count will be initialized one greater)
  recurse ( count + 1 );
}

当计数等于 4716 时程序停止!所以限制只是 4716 ! 我有点困惑!为什么程序在计数等于 4716 时停止执行! PS:在Visual studio 2010下执行。 谢谢

最佳答案

递归调用的限制取决于堆栈的大小。 C++ 语言对此没有限制(根据内存,符合标准的编译器需要支持的函数调用数量有一个下限,这是一个非常小的值)。

是的,“无限”递归会在某个时刻停止。我不完全确定你还有什么期望。

值得注意的是,设计软件来执行“无限”递归(或运行成百上千次的递归)是一个非常糟糕的主意。没有(标准)方法可以找出堆栈的限制,并且您无法从堆栈溢出崩溃中恢复。

你还会发现,如果你添加一个数组或其他一些数据结构[并使用它,所以它不会被优化掉],递归限制会降低,因为每个堆栈帧在堆栈上使用更多空间.

编辑:我实际上希望有一个更高的限制,我怀疑您是在 Debug模式下编译代码。如果你在 Release模式下编译它,我预计你会得到几千个,甚至可能是无穷无尽的,因为编译器将你的尾递归转换成一个循环。

关于c++ - 限制 C++ 中的递归调用(大约 5000 次)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16126241/

相关文章:

c++ - 为什么 vector 的 move ctor 不推导出 noexcept()?

algorithm - Python递归理解问题

algorithm - 如何在 Haskell 中编写 N 元树遍历函数

python - 在python中递归展平嵌套列表

c++ - 将 float* 转换为 std::complex<float>* 是否合法

c++ - 当 vector 增长时,使用 std::move 而不是复制重新分配内存的好处?

c - 递归函数到迭代,该函数给定 g(n) = 2*g(n-1)+3*g(n-2)

python - 递归地将pymysql Comment对象转换为树

c++ - 如果我们在不同的机器上将 c++11 mt19937 作为相同的种子,我们会得到相同的随机数序列吗

c++ - 在 boost::ptr_unordered_map 中存储指向 const 对象的指针