6

In order to know the limit of the recursive calls in C++ i tried this function !

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 );
}

this program halt when count is equal 4716 ! so the limit is just 4716 !! I'm a little bit confused !! why the program stops exeuction when the count is equal to 4716 !! PS: Executed under Visual studio 2010. thanks

4

3 回答 3

12

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

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

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

您还会发现,如果您添加一个数组或其他一些数据结构[并使用它,因此它不会得到优化],递归限制会降低,因为每个堆栈帧使用堆栈上的更多空间。

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

于 2013-04-20T23:22:41.683 回答
2

堆栈大小取决于您的环境。

例如在 *NIX 中,你可以在环境中修改堆栈大小,然后运行你的程序,结果会有所不同。

在 Windows 中,您可以这样更改它(来源)

$ editbin /STACK:reserve[,commit] program.exe
于 2013-04-20T23:21:51.043 回答
1

您可能已经用完了堆栈空间。

每次调用递归函数时,它都需要将返回地址压入堆栈,以便知道函数调用后返回到哪里。

它在 4716 处崩溃,因为它恰好在大约 4716 次迭代后用完堆栈空间。

于 2013-04-20T23:21:15.430 回答