【问题标题】:How is recursion implemented in JavaJava中的递归是如何实现的
【发布时间】:2012-05-22 10:46:54
【问题描述】:

Java 中的递归是如何实现的?我的问题是关于在 Java 中执行递归方法时会发生什么。我隐约明白它使用了堆栈,但我正在寻找一个清晰的例子来解释。

【问题讨论】:

标签: java recursion


【解决方案1】:

Java 对递归的处理与其他(命令式)语言没有太大区别。

a stack 为每个方法调用保存一个堆栈帧。该堆栈是call stack(或者只是“堆栈”,当上下文清楚地表明其含义时)。堆栈上的元素称为“堆栈帧”。

堆栈帧保存传入的方法参数和方法调用的局部变量(可能还有一些其他数据,例如返回地址)。

当一个方法调用自己(或者,实际上,任何方法)时,会为新调用方法的参数和局部变量创建一个新的堆栈帧。

在方法执行期间,代码只能访问当前(即最顶层)堆栈帧中的值。

这样一个(局部)变量似乎可以同时具有许多不同的值。

除了正常的方法调用之外,不会以任何其他方式处理递归,除了多个堆栈帧将表示同时调用同一方法。

【讨论】:

  • 我要说“除了尾调用递归优化。”但显然 Java VM 仍然不支持它。 stackoverflow.com/questions/3616483/…
  • @MichaelAnderson:简单地说尾递归优化是“简单地”在编译器/运行时意识到除了返回地址不再需要它时重新使用当前堆栈帧。它不会从根本上改变堆栈(和递归)的工作方式。
【解决方案2】:

当一个方法被调用时,它需要空间来保存它的参数、它的局部变量和返回地址,这个空间被称为激活记录(堆栈帧)。

递归是调用一个恰好与调用者同名的方法, 因此递归调用并不是一个直接调用它的方法,而是一个方法调用的实例化 同一原件的另一个实例化。这些调用在内部由不同的激活记录表示 这意味着它们是由系统区分的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-01
    • 2014-11-23
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多