Java&& ||在RETURN语句中?

时间:2014-02-04 15:49:29

标签: java algorithm recursion syntax return

我正在查看一些Java算法示例,我在递归方法中遇到了这个代码段:

boolean subTree(TreeNode t1, TreeNode t2) {
    if (t1 == null) {
        return false;
    }
    if (t1.value == t2.value) {
        if (treeMatch(t1, t2))
            return true;;
    }
    return (subTree(t1.left, t2) || subTree(t1.right, t2));
}

不知道(并且从未见过)||在之前的返回语句中使用,更不用说递归语句了,真让我感到困惑。我将代码复制到Eclipse中以查看它是否有效。然后我替换了||与&&和Eclipse似乎并没有被它困扰。从逻辑上讲,我理解这个递归代码应该继续沿着TreeNode t1的左右子树,但我正在寻找关于这种Java语法如何工作的更多理论解释。

有人可以解释||背后的含义和&&在Java的return语句中?在递归方面它意味着什么?它是否仅在与递归一起使用时才有意义?

7 个答案:

答案 0 :(得分:12)

如方法签名中所定义,您必须返回boolean。因此,在return关键字之后,您必须提供boolean 或表达式,并将其评估为boolean

在你的情况下,你有一个探索(subTree(t1.left, t2) || subTree(t1.right, t2));,其中两个操作数将被评估为boolean,只有当第一个评估为{{{}时,你才会对它们应用逻辑OR 1}}。如果第一个操作数评估为false,则不会评估第二个操作数,并且true将被撤销。

答案 1 :(得分:9)

它们的工作方式相同,无论是否存在递归语句。在你的表达中:

(subTree(t1.left, t2) || subTree(t1.right, t2))

如果对subTree(t1.left, t2)的第一次调用求值为true,则不会调用或尝试计算第二个表达式。这只是||&&运算符的标准短路行为,也就是运算符如何处理赋予它们的任何参数。

答案 2 :(得分:0)

return (subTree(t1.left, t2) || subTree(t1.right, t2));

评估第一个条款subTree(t1.left, t2),然后评估第二个条款。

因此,节点一直到叶子节点将进行评估,然后开始恢复工作在正确节点上的树(以及它的所有左节点)。

答案 3 :(得分:0)

这是将返回布尔值

的逻辑或运算符
 return (subTree(t1.left, t2) || subTree(t1.right, t2))// return boolean value

和&&还写了像

这样的布尔值
return (subTree(t1.left, t2) && subTree(t1.right, t2))// return boolean value

两个算子的工作方式与数学逻辑相同

答案 4 :(得分:0)

Java return返回由方法主体定义的单个值。如果你认为它是一个通用函数(它不是,但它有助于理解),它就像你的例子中的return(boolean result)。现在和任何其他方法一样,您可以进行内联计算,从而产生一个中间值,然后将其转发(匿名 )到Math.round(a + 0.5)这样的实际函数。

结合那个和

final boolean result = subTree(t1.left, t2) || subTree(t1.right, t2);
return result;

变为

return (subTree(t1.left, t2) || subTree(t1.right, t2));

答案 5 :(得分:0)

Ther只是布尔值和/或短路。

短路意味着它评估第一个操作数,然后仅在需要决定结果时才评估第二个操作数。你知道,真的是|| x =真;虚假&& x = false,无论x的值是多少,因此在这些情况下甚至不进行评估。

如果评估有副作用并且您希望它们始终发生,那么您应该使用&或者不使用短路,因此评估两个操作数。

答案 6 :(得分:0)

我将根据[Java Language Specification]

解释它

return语句定义为:

ReturnStatement:
      return Expressionopt ;
  

带有Expression的return语句尝试将控制权转移给调用者       包含它的方法; 表达式的值成为值       方法调用

     

... 执行这样的return语句首先评估表达式

什么是表达:

  

表达式是由变量运算符和方法调用组成的构造,       根据语言的语法构造,评估为单个值

return (subTree(t1.left, t2) || subTree(t1.right, t2));

让我们解构它:

return Expression; //Statement

Expression : (subTree(t1.left, t2) || subTree(t1.right, t2))

如前所述 - 表达式由方法调用,运算符等组成 - subTree

(方法调用子树的结果)逻辑运算符(方法调用子树的结果)

结果将是表达式的评估值。