2012-12-18 40 views
1

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

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

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

+0

我看到的是一个编译错误。 –

回答

1

此功能将递归遍历二叉树直到左半遍历,然后打印数据,然后它会遍历树的右半

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

这种处理方式被称作“为了遍历”作为函数所表示的,其它方式也是“预序遍历”,其中数据是第一印刷,和“后序遍历”其中数据最后打印。 Wikipedia有更多信息。

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

作为一个比喻,认为Inception除了每个梦想被暂停直到内完成梦想。另一个区别是在Inception中,外部梦控制了内部梦的终止,而在递归中,外部调用需要等到内部调用终止后才能继续。

+0

谢谢我明白你的观点。但我想我的问题是,看着执行的流程,在我的理解中,函数通过左半部分,但不打印数据,这是不正确的,因为它的确如此。所以在这个意义上,我的问题是,如果函数能够达到打印数据的语句以及通过右半部分的语句,如果递归地通过左半部分的语句将导致函数终止,这将如何发生? –

+0

@RuruMorlano该函数本身被多次调用。这是递归的本质,对这些调用的终止并不意味着它们全部终止,甚至不与其他调用相关。 –

+0

我以为所有的电话都马上终止。非常感谢 –

2

您似乎正在思考方法的单一激活。在递归调用情况下,可以多次调用同一个方法。每个呼叫都有自己的堆栈帧。返回只返回它被调用的激活。当它返回时,控制转回到调用它的激活,就好像它已经被不同的方法调用一样。

递归调用之后的代码在每次激活时立即从其调用的激活中返回。

+0

非常感谢。我现在明白了,你以为我在想什么是我真正想的。 –

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