C ++限制recursion深度?
在Python中有一个最大的recursion深度。 好像是因为Python是一个解释器,而不是编译器。 C ++有相同的概念吗? 或者它只与RAM限制连接?
C ++中的限制是由于堆栈的最大大小。 这通常比内存的大小还要小几个数量级,但仍然相当大。 (幸运的是,诸如string内容之类的大型事物通常不在堆栈本身上。
堆栈限制通常在操作系统级别可调。 (如果您使用的是Unix,请参阅内置ulimit
shell的文档。)本机(OSX)上的默认值为8 MB。
[编辑]当然,在计算你的recursion有多深的时候,堆栈的大小并不能完全帮助你。 要知道,你必须计算recursion函数(也称为堆栈帧)的激活logging (或logging)的大小。 最简单的方法就是使用反汇编器(大多数debugging器的特性),并在每个函数的开始和结束处读出堆栈指针调整的大小。 这是凌乱的。 (你可以用其他方法来处理它 – 例如,计算两个调用中variables指针的区别 – 但是它们更加糟糕,特别是对于可移植代码来说,从反汇编中读取值更容易。
不,C ++没有明确的recursion深度。 如果超过最大堆栈大小(在Windows中默认为1 MB),则C ++程序将溢出堆栈,并终止执行。
C或C ++标准中没有recursion深度跟踪或限制。 在运行时,深度受限于堆栈可以增长的大小。
C ++确实有一个最大的recursion深度,受限于堆栈。 但是,现代操作系统能够在填满时dynamic地扩展用户空间堆栈,仅通过内存空间和内存碎片来限制recursion深度。
我相信这个限制是平台上可用堆栈的大小。 从我读过的,在Linux上默认是8K 8MB,但现代内核可以dynamic调整堆栈大小。
Python对recursion调用有可调限制 ,而C ++受限于堆栈大小。
此外,许多语言或编译器可以通过删除调用者的堆栈帧来优化尾recursion,从而不会消耗额外的堆栈空间。 (在recursion调用中,调用函数做的唯一事情就是在recursion调用之后返回recursion调用的返回值。)
int fact(int n, int accum=1){ if (n==0) return accum; else return fact(n-1,n*accum); //tail recursion here. }
Python不优化尾recursion(但是无堆栈的Python ),C ++不需要尾recursion优化,但是我相信gcc会优化尾recursion。 JVM并没有优化尾recursion,尽pipeScala语言在某些常见的logging情况下是有用的。 Scheme和Lisp(也可能是其他函数式语言)要求优化尾recursion。