Java-Recursion:递归方法调用后的语句何时执行

时间:2012-12-18 04:34:10

标签: java data-structures recursion

方法调用后的语句何时才会执行?

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

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

此函数将递归遍历二叉树,直到遍历左半部分,然后打印数据,然后它将遍历右半部分

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

这种处理方式称为"按顺序遍历" ,如您的功能所示,其他方式为"预订单遍历" ,首先打印数据,"发布订单遍历" ,最后打印数据。 Wikipedia有更多信息。

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

作为类比,请考虑 Inception ,除非每个梦想暂停,直到内心梦想结束。另一个区别是,在Inception中,外部梦想控制内部梦想的终止,而在递归中,外部调用需要等到内部调用终止,然后才能继续。

答案 2 :(得分:0)

尝试运行此功能,它可以帮助您获得良好的效果。

// 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);
}