Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
can';不要停止递归java_Java_Recursion - Fatal编程技术网

can';不要停止递归java

can';不要停止递归java,java,recursion,Java,Recursion,我试图使用它的标签搜索节点,并在目标节点下添加一个新节点, 当我尝试使用递归搜索它时,它总是返回错误的目标或返回null。 有人知道怎么修吗 public TreeNode getNodeReference(String label){ if(left!=null){ if(check(left,label)==true) return left; left.getNodeReference(label); }

我试图使用它的标签搜索节点,并在目标节点下添加一个新节点, 当我尝试使用递归搜索它时,它总是返回错误的目标或返回null。 有人知道怎么修吗

public TreeNode getNodeReference(String label){

    if(left!=null){
        if(check(left,label)==true)
            return left;
         left.getNodeReference(label);
    }

    if(middle!=null){
        if(check(middle,label)==true)
           return middle;
        middle.getNodeReference(label);
    }
    if(right!=null)
     { if(check(right,label)==true)
          return right;
        right.getNodeReference(label);
    }
    return null;
}


public boolean check(TreeNode tree,String label){

    if(tree.getLabel().equals(label))
        return true;
    else return false;
}

如果您实际跟踪代码,您可以非常清楚地看到它返回错误结果的原因。如果树的第一级的所有子级都与标签不匹配(假设左/中/右均为非null),我已在下面标记了代码路径:

本质上,您可以调用child.getNodeReference(标签),但这就是您要做的全部。你叫它。然后放弃返回的值并继续,因此搜索实际上永远不会下降到最初调用getNodeReference的节点的第一级

因此,对于初学者来说,这种一般模式正是您想要的:

if (child != null) { 
    if (check(child, label))
        return child; // match found
    TreeNode childResult = child.getNodeReference(label);
    if (childResult != null)
        return childResult; // match found deeper in tree; this is what you did not do.
}
也就是说,这里有一个较短的实现(请记住,这与您的实现并不完全相同,因为您的实现也跳过了检查第一次调用getNodeReference的实际节点):

一般来说,您应该坐下来,仔细查看代码,一次只看一行。通常,当你这样做的时候,像这样的问题就会变得很清楚


希望这会有所帮助。

如果您实际跟踪代码,您可以非常清楚地看到它返回错误结果的原因。如果树的第一级的所有子级都与标签不匹配(假设左/中/右均为非null),我已在下面标记了代码路径:

本质上,您可以调用child.getNodeReference(标签),但这就是您要做的全部。你叫它。然后放弃返回的值并继续,因此搜索实际上永远不会下降到最初调用getNodeReference的节点的第一级

因此,对于初学者来说,这种一般模式正是您想要的:

if (child != null) { 
    if (check(child, label))
        return child; // match found
    TreeNode childResult = child.getNodeReference(label);
    if (childResult != null)
        return childResult; // match found deeper in tree; this is what you did not do.
}
也就是说,这里有一个较短的实现(请记住,这与您的实现并不完全相同,因为您的实现也跳过了检查第一次调用getNodeReference的实际节点):

一般来说,您应该坐下来,仔细查看代码,一次只看一行。通常,当你这样做的时候,像这样的问题就会变得很清楚

希望能有所帮助。

问题是: 您没有对内部调用返回的值执行任何操作

例如:

  • 左不为空
  • 检查返回错误
  • 使用标签调用getNodeReference
  • 左不为空
  • 检查返回真值
    (返回第一个呼叫的true,但您无法捕获它)
  • 中间不是空的
  • 检查。。。

    X.返回空值;

  • 问题是: 您没有对内部调用返回的值执行任何操作

    例如:

  • 左不为空
  • 检查返回错误
  • 使用标签调用getNodeReference
  • 左不为空
  • 检查返回真值
    (返回第一个呼叫的true,但您无法捕获它)
  • 中间不是空的
  • 检查。。。

    X.返回空值;


  • 一般的问题是递归调用该方法,但不根据结果执行任何操作。因此,当调用left.getNodeReference()时,将结果保存在一个变量中,并将其与null进行比较。如果它是非空的,那么返回结果——完成了。否则,继续前进。middle和right也一样。您的一般问题是递归调用该方法,但不根据结果执行任何操作。因此,当调用left.getNodeReference()时,将结果保存在一个变量中,并将其与null进行比较。如果它是非空的,那么返回结果——完成了。否则,继续前进。中间和右边也一样。谢谢你的回复,它完美地解决了我的问题!顺便问一下,有没有学习递归的有用信息或网站?我发现总是很难理解递归程序是如何工作的;好问题。我认为这是经验的结果。我隐约记得几年前上过SML大学课程后的一次顿悟——也许如果你对更高级的概念和抽象的东西感兴趣,你可能想学习函数式语言,如ML、Haskell或Lisp。对于声明性语言,比如Java,我在一个粗略的Google搜索中发现了这一点:--可能值得一看。按照分形、数学归纳法等思路思考。离题但有趣的是,许多(全部?)程序可以简化为有限状态机,可以很容易地递归实现。这是程序背后的理论,比如(写起来很有趣)。谢谢你的回复,它完美地解决了我的问题!顺便问一下,有没有学习递归的有用信息或网站?我发现总是很难理解递归程序是如何工作的;好问题。我认为这是经验的结果。我隐约记得几年前上过SML大学课程后的一次顿悟——也许如果你对更高级的概念和抽象的东西感兴趣,你可能想学习函数式语言,如ML、Haskell或Lisp。对于声明性语言,比如Java,我在一个粗略的Google搜索中发现了这一点:--可能值得一看。按照分形、数学归纳法等思路思考。离题但有趣的是,许多(全部?)程序可以简化为有限状态机,可以很容易地递归实现。这是程序背后的理论,比如(它们编写起来很有趣)。
    public TreeNode getNodeReference (String label) {
    
        if (check(this, label))
            return this;
    
        TreeNode childResult = null; 
        if (left != null)
            childResult = left.getNodeReference(label);
        if (childResult == null && middle != null)
            childResult = middle.getNodeReference(label);
        if (childResult == null && right != null)
            childResult = right.getNodeReference(label);
    
        return childResult;
    
    }