返回| |语句在java中如何工作?
我是编程新手,所以我一直在CodingBat.com上练习。在Recursion-2部分,有一个问题我无法(递归地)解决,所以我查找了一个答案。找到的解决方案包含以下代码返回| |语句在java中如何工作?,java,recursion,Java,Recursion,我是编程新手,所以我一直在CodingBat.com上练习。在Recursion-2部分,有一个问题我无法(递归地)解决,所以我查找了一个答案。找到的解决方案包含以下代码 public boolean split53(int[] nums) { return helper(0, nums, 0, 0); } private boolean helper(int start, int[] nums, int sum1, int sum2) { if (start >= nums.
public boolean split53(int[] nums) {
return helper(0, nums, 0, 0);
}
private boolean helper(int start, int[] nums, int sum1, int sum2) {
if (start >= nums.length) return sum1 == sum2;
if (nums[start] % 5 == 0)
return helper(start + 1, nums, sum1 + nums[start], sum2);
if (nums[start] % 3 == 0)
return helper(start + 1, nums, sum1, sum2 + nums[start]);
return helper(start + 1, nums, sum1 + nums[start], sum2)
|| helper(start + 1, nums, sum1, sum2 + nums[start]);
}
退回什么东西或别的东西到底意味着什么?!(最后一个return语句)代码必须在两个值之间交替工作,但我在任何地方都找不到任何关于return语句的内容 这不是它的意思。这并不意味着“返回一个或另一个值”
return
语句返回整个表达式的结果。也就是说,先计算OR(|
),然后再计算返回值
,然后该表达式的结果是返回值
ed
它可能写得更清楚:
return (helper(start + 1, nums, sum1 + nums[start], sum2)
|| helper(start + 1, nums, sum1, sum2 + nums[start]) );
返回一个布尔值
> public boolean split53(int[] nums) {
true | | false
为true
,false | | false
为false
,等等。如果其中一个术语为true,则此语句返回true
return helper(start + 1, nums, sum1 + nums[start], sum2)
|| helper(start + 1, nums, sum1, sum2 + nums[start]);
如果调用helper()
返回true,则返回true
。以下是以不同但功能等效的方式编写的相同代码:
boolean helperResponse1 = helper(start + 1, nums, sum1 + nums[start], sum2);
if (helperResponse1 == true)
return true;
else {
boolean helperResponse2 = helper(start + 1, nums, sum1, sum2 + nums[start]);
if (helperResponse2 == true)
return true;
else
return false;
}
为了清楚起见,我放了很多不必要的东西
return a || b;
并不意味着:
return a || return b;
它实际上意味着:
return (a || b);
它将计算a | | b,然后返回结果:
因此,如果a
或b
为true
(其中一个或两个都为true
),它将返回true
。只有当a
和b
都为false时,才会出现false
关键是:它首先计算布尔表达式,然后返回值
编辑:您可以查看有关其工作原理的示例。首先,我们有位运算
|
(or)和&
(and),它们将对两边进行求值以得到答案。然而,如果你用它来做一个递归函数,它会无条件地做两边的事情。如果您不熟悉or和,以下是真值表:
+-------+-------+-------+
| B | A | A|B |
+-------+-------+-------+
| false | false | false |
| false | true | true |
| true | false | true |
| true | true | true |
+-------+-------+-------+
+-------+-------+-------+
| B | A | A&B |
+-------+-------+-------+
| false | false | false |
| false | true | false |
| true | false | false |
| true | true | true |
+-------+-------+-------+
虽然或与人们所期望的略有不同,但却是恰到好处的。事实是,对于这些true |无论什么都是true
无论右侧是什么,false&无论什么false
无论右侧是什么。在这些情况下,我们实际上不需要知道右边,或者我们甚至不需要进行生成该值的计算|
和&
与
和&
相同,只是它的评估值不会超过需要。下面是一个小测试:
那么在您的代码示例中,它意味着什么?因为它是|
,或者,如果第一个帮助程序
调用返回true,那么将结束该方法,并将成为结果。但是,如果它是false
,则另一个调用的结果将成为该方法的结果
可以这样写,而不改变结果:
boolean tmp = helper(start + 1, nums, sum1 + nums[start], sum2);
if( tmp )
return tmp;
return helper(start + 1, nums, sum1, sum2 + nums[start]);
然而,|
比这更容易阅读。每个递归函数都需要一个结束点。你的是:
if (start >= nums.length) return sum1 == sum2;
它将返回true或false,具体取决于(sum1==sum2)
关于声明:
else {return (A || B); }
它将进入第一个子句,直到返回TRUE或FALSE。如果返回TRUE,则该行结束。否则,它将计算第二个子句并返回匹配项(A | | B)
您的方法的返回类型是什么?什么是|
运算符?请搜索了解条件|
,&&
运算符是如何工作的。如您所见,该方法返回布尔值。将返回helper(…)
|helper(…)
的结果。如果你把它想象成一个圆括号,例如:return(helper(…)| | helper(…)代码>答案对你有帮助吗?是的,非常有帮助!很抱歉耽搁了这么久。我还在学习StackOverflow界面。我很确定这是错的短路评估,因此一旦它发现某件事是真的,它就会停止,而不会费心评估其余的。@RSinghS短路与我的答案无关。它仍然首先计算表达式,然后返回值。短路发生在|
操作中(但请注意,我没有提到这一点)。它给出相同的输出,但不相关。@mikeyaworski,如果您执行返回mymethod()| | mymethod()
和mymthod
打印一个字符串并返回true它与returnmymethod()| mymethod()不同
将运行该方法两次,即使第一个返回true。对于一个递归函数来说,可能是它是否停止的不同之处。@Sylwester是的,我理解这一点(这可能会对他的递归产生影响),但是,这并不意味着我说的是错的。实际上,|
短路,所以如果helperrresponse1为真,就不会产生helperrresponse2。。你解释得好像它是|
而不是|
一样。我说了同样的话。你确定它没有“短路”吗?如果第一个是真的,那么检查第二个是真还是假是否都是真的吗?|
是否执行短路操作与这个问题无关,这个问题是关于return
如何处理包含|
的表达式。但是,是的,它确实会短路。如果左操作数为true
,则| |
甚至不会计算右操作数;它将计算为true
。(相反,如果&
的左操作数为假
,则&&
甚至不会计算右操作数;它将计算为假
)啊,好的,我现在就知道了。短路与回流无关;它位于| |
的核心操作中。
else {return (A || B); }
(TRUE || TRUE) -> TRUE
(TRUE || FALSE) -> TRUE
(FALSE || TRUE) -> TRUE
(FALSE || FALSE) -> FALSE