在Python中有一个最大递归深度。似乎这是因为Python是一个解释器,而不是编译器。 C ++有相同的概念吗?或者它只与RAM限制连接?
答案 0 :(得分:47)
C ++中的限制是由于堆栈的最大大小。这通常比RAM的大小少了几个数量级,但仍然相当大。 (幸运的是,像字符串内容这样的大型内容通常不会保留在堆栈本身上。)
堆栈限制通常在OS级别可调。 (如果您使用的是Unix,请参阅内置ulimit
shell的文档。)此计算机(OSX)上的默认值为8 MB。
[编辑]当然,在计算出你可以递归的程度时,堆栈的大小本身并不完全有用。要知道这一点,您必须计算递归函数(也称为堆栈帧)的激活记录(或记录)的大小。最简单的方法(我知道)是使用反汇编程序(大多数调试程序的一个功能)并在每个函数的开头和结尾读出堆栈指针调整的大小。哪个很乱。 (你可以通过其他方式解决它 - 例如,计算两个调用中指向变量的指针之间的差异 - 但它们甚至更糟糕,特别是对于可移植代码。从反汇编中读取值更容易IMO。)
答案 1 :(得分:22)
不,C ++没有明确的递归深度。如果超出最大堆栈大小(在Windows上默认为1 MB),则C ++程序将溢出堆栈并终止执行。
答案 2 :(得分:6)
C或C ++标准中没有递归深度跟踪或限制。在运行时,深度受到堆栈增长的限制。
答案 3 :(得分:3)
C ++确实具有最大递归深度,受堆栈限制。但是,现代操作系统能够在填满时动态扩展用户空间堆栈,仅限制内存空间和内存碎片的递归深度。
答案 4 :(得分:3)
我认为限制是平台上可用堆栈的大小。根据我的阅读,Linux上默认为 8K 8MB,但现代内核可以动态调整堆栈大小。
答案 5 :(得分:3)
Python在递归调用上有tunable limit,而C ++受到堆栈大小的限制。
此外,许多语言或编译器可以通过删除调用者的堆栈帧来优化尾递归,从而不会消耗额外的堆栈空间。 (在尾递归中,调用函数唯一做的就是在进行递归调用之后返回递归调用的返回值。)
int fact(int n, int accum=1){
if (n==0) return accum;
else return fact(n-1,n*accum); //tail recursion here.
}
Python不优化尾递归(但是stackless Python确实如此),并且C ++不需要尾递归优化,但我相信gcc优化了尾递归。 JVM没有优化尾递归,尽管Scala语言在某些常见的文档中也有。 Scheme和Lisp(以及可能还有其他函数语言)要求优化尾递归。