【问题标题】:Java-Recursion: When does statements after a recursive method call executesJava-Recursion:递归方法调用后的语句何时执行
【发布时间】:2012-12-05 06:26:02
【问题描述】:

方法调用本身之后的语句什么时候执行?

private void inorderHelper(TreeNode node)
{
    if ( node==null )
        return;
    inorderHelper(node.leftNode);
    System.out.printf("%d", node.data);
    inorderHelper(node.rigthNode);
}

我只能看到代码行 inorderHelper(node.leftNode) 将继续迭代,直到 node == null 并且该方法在 node.data 打印之前立即终止。我认为我没有很好地递归,但我能找到的所有示例在递归调用之后都没有语句。我只想知道 System.out.printf("%d",node.data) 这样的语句什么时候会在方法返回之前执行?

【问题讨论】:

  • 我看到的是编译错误..

标签: java data-structures recursion


【解决方案1】:

您似乎在考虑方法的单个激活。在递归调用情况下,可以多次调用相同的方法。每个调用都有自己的堆栈帧。仅从调用它的激活返回。当它返回时,控制权被转移回调用它的激活,就像它被不同的方法调用一样。

递归调用后的代码在每次激活中运行,在从它调用的激活返回时立即运行。

【讨论】:

  • 非常感谢。我现在明白了,你以为我在想的就是我真正在想的。
【解决方案2】:

这个函数会递归遍历二叉树直到遍历完左半边,然后打印数据再遍历右半边强>的树。

这在树的每一层都是一样的,这意味着在打印数据之前,您将在任何级别看到树的左半部分打印,然后是右半部分.

这种处理方式称为“按顺序遍历”,如您的函数所示,其他方式是“前序遍历”,其中首先打印数据,以及最后打印数据的“后序遍历”Wikipedia 有更多信息。

为了更好地学习,您可以使用调试器逐步完成。

打个比方,想想Inception,除了每个梦想都会暂停,直到内心的梦想结束。另一个不同之处在于,在 Inception 中,外部梦境控制着内部梦境的终止,而在递归中,外部调用需要等到内部调用终止后才能继续。

【讨论】:

  • 谢谢我明白你的意思。但我认为我的问题是;在我的理解中查看执行流程,该函数通过左半部分但不打印数据,这是不正确的,因为它确实如此。所以从这个意义上说,我的问题是函数如何到达打印数据的语句和通过右半部分的语句,如果递归通过左半部分的语句将导致函数终止?
  • @RuruMorlano 函数自身被多次调用。这就是递归的本质,在这些调用中终止并不意味着它们都终止,甚至与其他调用无关。
【解决方案3】:

尝试运行它,它应该可以帮助您获得一张好照片。

// first call with depth 0
private void inorderHelper(TreeNode node, int depth)
{
  ++depth;
  if ( node==null ) {
    System.out.printf("null node at depth %d", depth);
    return;
  }
  System.out.printf("depth %d data %d before left side", depth, node.data);
  inorderHelper(node.leftNode, depth);
  System.out.printf("depth %d data %d middle", depth, node.data);
  inorderHelper(node.rigthNode, depth);
  System.out.printf("depth %d data %d after right side", depth, node.data);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-12
    • 2019-03-20
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2020-01-04
    相关资源
    最近更新 更多