限制C ++中的递归调用(约5000)?

时间:2013-04-20 23:19:38

标签: 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下执行。 感谢

3 个答案:

答案 0 :(得分:11)

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

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

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

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

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

答案 1 :(得分:2)

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

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

在Windows中,您可以通过(source)

进行更改
$ editbin /STACK:reserve[,commit] program.exe

答案 2 :(得分:1)

你可能用完了堆栈空间。

每次调用递归函数时,都需要在堆栈上推送一个返回地址,以便它知道在函数调用之后返回的位置。

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