Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/403.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_Recursion - Fatal编程技术网

返回| |语句在java中如何工作?

返回| |语句在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.

我是编程新手,所以我一直在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.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