Java 使用递归添加到变量

Java 使用递归添加到变量,java,recursion,red-black-tree,Java,Recursion,Red Black Tree,下面的代码是使用私有方法添加到变量计数。根据我的理解,在该变量下面是条件语句,在递归堆栈向上跟踪之前,这些条件语句不会运行。我说得对吗?我的测试失败了,我试着看看是因为我的代码错了还是因为我使用的递归错误了 public boolean containsRightRedEdge() { int count = 0; count += containsRightRedEdge(root); if(count > 0) return true; return f

下面的代码是使用私有方法添加到变量计数。根据我的理解,在该变量下面是条件语句,在递归堆栈向上跟踪之前,这些条件语句不会运行。我说得对吗?我的测试失败了,我试着看看是因为我的代码错了还是因为我使用的递归错误了

public boolean containsRightRedEdge() {
    int count = 0;
    count += containsRightRedEdge(root);
    if(count > 0) return true;
    return false;
}

private int containsRightRedEdge(Node n) {
   if (n == null) return 0;
   if (isRed(n.right)) {
       return 1;
   }
   return containsRightRedEdge(n.left) + 0 + containsRightRedEdge(n.right);         
}

在我的问题中,上面的代码是在这个实例中使用递归的正确方法。我刚才有个打字错误,现在已经解决了。把这个问题留给其他人参考

在我的问题中,上面的代码是在这个实例中使用递归的正确方法。我刚才有个打字错误,现在已经解决了。把这个问题留给其他人参考

我想说您使用递归非常正确,但是您对方法名称的选择可以减少混乱,并且可以简化逻辑。 我对您尝试实现的算法不太熟悉,但您可以尝试以下方法:

public boolean containsRightRedEdge(Node root) {
   return getNumRightRedEdges(root) > 0;
}

private int getNumRightRedEdges(Node n) {
   if (n == null) return 0;
   if (isRedEdge(n)) return 1;

   return getNumRightRedEdges(n.left) + getNumRightRedEdges(n.right);
}

通常,递归方法不应与非递归方法具有相同的名称。这些方法名称更清楚地传达了每个方法的功能。此外,您的基本情况可能是错误的,因为您目前根据我解释的算法应该如何工作来编写它们。当然,我不知道
isRed()
中的代码,所以我可能在这里做了错误的假设。

我想说您使用递归的方式非常正确,但是您选择的方法名称可能不会那么混乱,逻辑也可以简化。 我对您尝试实现的算法不太熟悉,但您可以尝试以下方法:

public boolean containsRightRedEdge(Node root) {
   return getNumRightRedEdges(root) > 0;
}

private int getNumRightRedEdges(Node n) {
   if (n == null) return 0;
   if (isRedEdge(n)) return 1;

   return getNumRightRedEdges(n.left) + getNumRightRedEdges(n.right);
}

通常,递归方法不应与非递归方法具有相同的名称。这些方法名称更清楚地传达了每个方法的功能。此外,您的基本情况可能是错误的,因为您目前根据我解释的算法应该如何工作来编写它们。当然,我不知道
isRed()
中的代码,所以我可能在这里做了错误的假设。

是否应该返回containsrightredge(n.left)+0+containsrightredge(n.left)be<代码>返回容器右边缘(n.left)+0+容器右边缘(n.right)?另外,您的测试如何失败?你的意见是什么?你的预期产出是多少?你观察到的结果是什么?@Turing85这不是我的测试,教授只会说通过或失败。我真正担心的是,在这种情况下,我是否正确地使用了递归。如果我是,我会写我自己的测试,看看问题是什么。在使用递归之前,我想确保我正确使用了递归though@JoshuaSnider是的,应该是,谢谢。现在进行更改。@ChristopherJakob:这是否解决了问题,还是仅仅是问题中的一个输入错误?行
是否应返回containsRightRedEdge(n.left)+0+containsRightRedEdge(n.left)be<代码>返回容器右边缘(n.left)+0+容器右边缘(n.right)?另外,您的测试如何失败?你的意见是什么?你的预期产出是多少?你观察到的结果是什么?@Turing85这不是我的测试,教授只会说通过或失败。我真正担心的是,在这种情况下,我是否正确地使用了递归。如果我是,我会写我自己的测试,看看问题是什么。在使用递归之前,我想确保我正确使用了递归though@JoshuaSnider是的,应该是,谢谢。现在就做改变。@ChristopherJakob:这能解决问题吗?还是你问题中的一个输入错误?谢谢@Sean Glover,我在这里学到了一些东西。非常干净的代码。谢谢@Sean Glover,我在这里学到了一些东西。非常干净的代码。