Java && || 在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的返回声明中的&&? 在递归方面它意味着什么? 它与递归一起使用时才有意义吗?
如方法签名中所定义,您必须返回一个boolean
。 因此,在return
关键字之后,您将必须提供一个boolean
或一个被计算为boolean
的表达式 。
在你的情况下你有exces (subTree(t1.left, t2) || subTree(t1.right, t2));
其中两个操作数将被计算为boolean
,只有当第一个求值为false
才会对它们应用逻辑OR
。 如果第一个操作数的计算结果为true
,则不会计算第二个操作数,并且将返回true
。
它们以相同的方式工作,无论是否存在递归语句。 在你的表达中:
(subTree(t1.left, t2) || subTree(t1.right, t2))
如果对subTree(t1.left, t2)
的第一次调用求值为true
,则不会调用或尝试计算第二个表达式。 这只是||
的标准短路行为 和&&
运算符,以及运算符如何处理赋予它们的任何参数。
这是将返回布尔值的逻辑或运算符
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
由方法体定义的单个值。 如果你认为它是一个generics函数(它不是,但它有助于理解),它就像你的例子中的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));
Ther只是布尔值和/或短路。
短路意味着它评估第一个操作数,然后仅在需要决定结果时才评估第二个操作数。 你知道,真的是|| x =真; false && x = false,无论x的值是多少,因此在这些情况下甚至不进行评估。
如果评估有副作用,并且您希望它们始终发生,那么您应该使用&或| 不使用短路,因此评估两个操作数。
return (subTree(t1.left, t2) || subTree(t1.right, t2));
评估第一个子句subTree(t1.left, t2)
然后第二个。
因此,节点一直到叶节点将进行评估,然后开始处理正在运行的节点的树(以及它的所有左节点)。
我将根据[Java语言规范]解释它:
return语句定义为:
ReturnStatement: return Expression opt ;
带有Expression的return语句尝试将控制权转移给包含它的方法的调用者; Expression的值成为方法调用的值
… 执行这样的return语句首先评估Expression 。
什么是表达:
表达式是由变量 , 运算符和方法调用组成的构造,它是根据语言的语法构造的,其值为单个值
return (subTree(t1.left, t2) || subTree(t1.right, t2));
让我们解构它:
return Expression; //Statement Expression : (subTree(t1.left, t2) || subTree(t1.right, t2))
如前所述 – 表达式由方法调用 ,运算符等组成 – subTree
(方法调用子树的结果)逻辑运算符(方法调用子树的结果)
结果将是表达式的评估值。