Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Java 爪哇及&|作为回报?_Java_Algorithm_Recursion_Syntax_Return - Fatal编程技术网

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,

我正在看一些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));
}
以前不知道(也不知道)| |在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))