为了知道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下执行。 感谢
答案 0 :(得分:11)
递归调用的限制取决于堆栈的大小。 C ++语言不限制这一点(从内存来看,符合标准的编译器需要支持多少函数调用的下限,这是一个非常小的值)。
是的,“无限地”递归会在某个时刻停止。我不完全确定你还有什么期望。
值得注意的是,设计软件进行“无限”递归(或者运行数百或数千次的递归)是一个非常糟糕的主意。没有(标准)方法来找出堆栈的限制,并且无法从堆栈溢出崩溃中恢复。
你还会发现,如果你添加一个数组或一些其他数据结构[并使用它,所以它没有得到优化],递归限制会降低,因为每个堆栈帧在堆栈上使用更多空间。
编辑:我实际上会期望更高的限制,我怀疑你是在调试模式下编译你的代码。如果你在发布模式下编译它,我希望你得到几千个,甚至可能无穷无尽,因为编译器会将你的尾递归转换成一个循环。
答案 1 :(得分:2)
堆栈大小取决于您的环境。
例如,在* NIX中,您可以修改环境中的堆栈大小,然后运行程序,结果会有所不同。
在Windows中,您可以通过(source):
进行更改$ editbin /STACK:reserve[,commit] program.exe
答案 2 :(得分:1)
你可能用完了堆栈空间。
每次调用递归函数时,都需要在堆栈上推送一个返回地址,以便它知道在函数调用之后返回的位置。
它在4716崩溃,因为它在大约4716次迭代后恰好用完了堆栈空间。