【问题标题】:Returning a value early from a recursive function从递归函数中提前返回一个值
【发布时间】:2015-07-16 02:02:18
【问题描述】:

我有一个节点树。在首先迭代此树深度时,我需要将所有重复节点的列表从根节点返回到我的当前节点。

由于某些业务需求,树的“已遍历”部分永远不会相同。我在树的已经遍历的部分中做了很多分支的交换/替换。因此,维护遍历节点列表可能不起作用,因为每次完成遍历节点时它都需要更新。

所以每当我需要回答 getDuplicateNodesOfMyCurrentNode() 时,我需要从树的顶部开始 (rootNode) 并首先搜索深度直到我的 currentNode 并返回一个 list<Nodes>,这是我的 @ 的重复987654325@.

private void getDuplicateNodesOfMyCurrentNode(Node parentNode, Node currentNode,List<Node> dupNodes){
  for(Node child: parentNode.getChildren()){
        if(child == currentNode){
            return;
        }
        if(child.getApp().equals(currentNode.getApp()){
            dupNodes.add(child);
        }
        getDuplicateNodesOfMyCurrentNode( child, currentNode, aDupNodes);

}

正如你们已经知道这段代码的问题一样,return 不会将控制权返回给该 API 的调用者,因为它会递归调用自身。 一旦我到达我的currentNode,我想要某种方式退出这个递归循环。

我可能可以通过维护一些布尔状态来实现这一点,但想知道解决这个问题的更好方法。

【问题讨论】:

  • 用break代替return?
  • 不,这不起作用.. Break 仅中断当前呼叫。我需要退出所有递归调用
  • 返回一个布尔状态(返回真)并继续检查 + 回退,直到你打到调用者。
  • 这里显示的方法不是递归的。这是一个简单的循环。既没有声明也没有修改的builtOn 是什么?顺便提一句。为您的方法考虑另一个名称。返回void 甚至boolean 的方法getDuplicateNodesOfMyCurrentNode 并不直观。
  • 感谢您的建议。我的 java 代码中有一个错字。修改它以使其递归。也是的,我会更改此方法的名称以使其更直观。只是专注于确保我在这里清楚自己和我的要求

标签: java recursion


【解决方案1】:

通过布尔值传递是否通过调用堆栈中止递归,并在递归调用时在必要时放弃当前的for 循环(也承认上面 Norbet van Nobelen 的评论暗示类似的东西)

private boolean getDuplicateNodesOfMyCurrentNode(Node parentNode, Node currentNode,List<Node> dupNodes){
    for(Node child: parentNode.getChildren()){
        if(child == currentNode){
            return false;
        }
        if(child.getApp().equals(currentNode.getApp()){
            dupNodes.add(child);
        }
        if (getDuplicateNodesOfMyCurrentNode( builtOn, currentNode, aDupNodes) == false){
            return false;
        }
    }
    return true;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2012-10-16
    • 2016-03-23
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    相关资源
    最近更新 更多