代码之家  ›  专栏  ›  技术社区  ›  Narek

C++限制递归深度吗?

  •  54
  • Narek  · 技术社区  · 15 年前

    在python中有一个最大的递归深度。似乎是因为python是一个解释器,而不是编译器。C++有相同的概念吗?或者它只与ram limit连接?

    6 回复  |  直到 12 年前
        1
  •  47
  •   Donal Fellows    15 年前

    C++中的限制是由于堆栈的最大大小。这通常比ram的大小小几个数量级,但仍然相当大。(幸运的是,像string这样的大东西 内容 通常不在堆栈本身上。)

    堆栈限制通常在操作系统级别可调。(参见文档了解 ulimit 如果您是在unix上,则为shell内置。)此计算机(osx)上的默认值为8mb。

    [编辑]当然,在计算递归的深度时,堆栈的大小本身并不完全有帮助。要知道这一点,你必须计算 激活记录 递归函数(也称为堆栈帧)的(或记录)。最简单的方法(据我所知)是使用反汇编程序(大多数调试器的一个特性)并在每个函数的开始和结束读取堆栈指针调整的大小。很乱。(例如,您可以用其他方法来计算两次调用中指向变量的指针之间的差异,但它们甚至更糟糕,特别是对于可移植代码而言。从反汇编中读取值在imo中更容易。)

        2
  •  22
  •   Justin Ethier    15 年前

    不,C++没有明确的递归深度。如果超过了最大堆栈大小(在Windows上默认为1 MB),则C++程序将溢出堆栈,执行将被终止。

        3
  •  6
  •   Mike DeSimone    15 年前

    在C或C++标准中没有递归深度跟踪或限制。在运行时,深度受堆栈增长的大小限制。

        4
  •  3
  •   Ignacio Vazquez-Abrams    15 年前

    C++具有最大递归深度,受堆栈限制。然而,现代操作系统能够在用户空间堆栈填满时动态扩展它,仅通过内存空间和内存碎片限制递归深度。

        5
  •  3
  •   Andy Shellam    15 年前

    我认为限制是平台上可用堆栈的大小。据我所知 8K 在Linux上默认为8MB,但现代内核可以动态调整堆栈大小。

        6
  •  3
  •   Ken Bloom    15 年前

    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(可能还有其他函数式语言)要求优化尾部递归。