Java 爪哇及&|作为回报?
我正在看一些Java算法示例,在递归方法中遇到了以下代码片段:Java 爪哇及&|作为回报?,java,algorithm,recursion,syntax,return,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,
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));
}
以前不知道(也不知道)| |在return语句中使用过,更不用说递归语句了,这让我很困惑。我将代码复制到Eclipse中,以查看它是否有效。然后,我将| |替换为&&并且Eclipse似乎没有被它所困扰。从逻辑上讲,我理解这个递归代码应该沿着TreeNode t1的左、右子树继续,但我正在寻找一个更为理论化的解释来解释这种Java语法是如何工作的
有人能解释Java返回语句中| |和&&的含义吗?它在递归方面意味着什么?它仅在与递归结合使用时才有意义吗?根据方法签名中的定义,您必须返回一个
布尔值。因此,在return
关键字之后,必须提供一个布尔值或一个表达式,该表达式的计算结果为布尔值
在您的例子中,您有expression(子树(t1.left,t2)| |子树(t1.right,t2))
中,两个操作数的计算结果为布尔值
,只有当第一个操作数的计算结果为false
时,才对它们应用逻辑或。如果第一个操作数的计算结果为true
,则将不计算第二个操作数,并将返回true
无论是否有递归语句,它们都以相同的方式工作。在你的表达中:
(subTree(t1.left, t2) || subTree(t1.right, t2))
如果对子树(t1.left,t2)
的第一次调用计算结果为true
,则不会调用或尝试计算第二个表达式。这只是|
和&&
运算符的标准短路行为,也是运算符在给定任何参数时的工作方式
return (subTree(t1.left, t2) || subTree(t1.right, t2));
计算第一个子句子树(t1.left,t2)
,然后计算第二个子句
因此,一直到叶节点的节点都将求值,然后开始在树的右节点(首先是它的所有左节点)上进行操作。这是将返回布尔值的逻辑or运算符
return (subTree(t1.left, t2) || subTree(t1.right, t2))// return boolean value
并且&&还为您编写了布尔值,如
return (subTree(t1.left, t2) && subTree(t1.right, t2))// return boolean value
这两个操作符的工作原理与数学逻辑相同Java的返回
返回由方法体定义的单个值。如果您将其视为一个泛型函数(虽然不是,但它有助于理解),那么在您的示例中,它就像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));
它们只是带有短路的布尔和/或
短路意味着它计算第一个操作数,然后仅在需要确定结果时才计算第二个操作数。你知道,真的| | x=真的;false&&x=false,无论x的值是多少,因此在这些情况下都不会对其进行计算
如果计算有副作用,并且您希望它们总是发生,那么您应该使用&或|这不使用短路,以便对两个操作数进行计算。我将根据以下内容进行解释:
return语句定义为:
ReturnStatement:
return Expressionopt ;
让我们重新构建它:
return Expression; //Statement
Expression : (subTree(t1.left, t2) || subTree(t1.right, t2))
如前所述-表达式由方法调用、运算符等组成-子树
(方法调用子树的结果)逻辑运算符(方法调用子树的结果)
结果将是表达式的求值值。通常如何使用return
语句?你给它的表达是什么?您可以执行返回a+b
,那么为什么不返回c|d
<代码>| |
和&
只是运算符。它是递归的或表达式不相关,也不是递归的和表达式。关键是返回布尔值。表达式**(函数(a)&&function(b))**实际上是一个布尔值,只要函数(int)返回一个布尔值即可。正如其他人基本上所说,return语句只不过是一个表达式。唯一“特别”的是它使用递归计算表达式。此外,考虑用<代码>布尔= r(子树(T1左,T2)子树(T1右方,T2))替换该行;code>然后返回r代码>+1短路行为信息非常相关,因为我们讨论的是递归调用。
return Expression; //Statement
Expression : (subTree(t1.left, t2) || subTree(t1.right, t2))