我正在查看一些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语句中?在递归方面它意味着什么?它是否仅在与递归一起使用时才有意义?
答案 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
(方法调用子树的结果)逻辑运算符(方法调用子树的结果)
结果将是表达式的评估值。