如何返回||声明在java工作?

时间:2014-03-07 19:36:18

标签: 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.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]);
}

返回什么或其他东西意味着什么?! (上一个返回语句)对于要工作的代码必须在2个值之间交替,但我找不到任何提及返回||任何声明。

7 个答案:

答案 0 :(得分:2)

return helper(start + 1, nums, sum1 + nums[start], sum2)
        || helper(start + 1, nums, sum1, sum2 + nums[start]);
如果对true的调用返回true,则

返回helper()。以下是使用不同但功能相同的方式编写的相同代码:

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;
}

为了清楚起见,我提出了许多不必要的东西。

答案 1 :(得分:1)

如果其中任何一个条件为真,则此语句返回true。

答案 2 :(得分:0)

这不是它的意思。它并不意味着“返回任何一个值,一个或另一个”。

return语句返回整个表达式的结果。也就是说,OR(||)首先在return之前进行评估,然后该表达式的结果return

可能写得更清楚:

return (helper(start + 1, nums, sum1 + nums[start], sum2)
        || helper(start + 1, nums, sum1, sum2 + nums[start]) );

答案 3 :(得分:0)

返回一个布尔值...

> public boolean split53(int[] nums) {

true || falsetruefalse || falsefalse等。

答案 4 :(得分:0)

return a || b;

意味着:

return a || return b;

实际上意味着:

return (a || b);

它会评估a || b,然后返回结果:

因此,如果abtrue(其中一个或两者都是true),那么它将return true。如果falsea均为假,则只有b

重点是:它首先计算布尔表达式,然后返回值。


编辑:您可以查看this test code有关其工作原理的示例。

答案 5 :(得分:0)

首先,我们按位操作|(或)和&(和),他们将评估双方以获得答案。但是,如果你要做一个递归函数,它将无条件地做双方。如果您不熟悉以及,这里是真值表:

+-------+-------+-------+
| 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 | whatevertrue无论右边是什么,false & whateverfalse无论右边是什么。在这些情况下,我们实际上不需要知道右侧,或者我们甚至不需要进行生成该值的计算。 ||&&|&相同,但不会评估超出其需要的内容。以下是一项小型测试you can run

class Test
{
  public static boolean getTrue()
  {
    System.out.println("returning true");
    return true;
  }

  public static boolean getFalse()
  {
    System.out.println("returning false");
    return false;
  }

  public static void main(String[]args)
  {
    System.out.println( "Doing bitwise or");
    System.out.println( getFalse() | getFalse() );
    System.out.println( getFalse() | getTrue()  );
    System.out.println( getTrue()  | getFalse() );
    System.out.println( getTrue()  | getTrue()  );

    System.out.println( "Doing conditional (short-circuiting) or");
    System.out.println( getFalse() || getFalse() );
    System.out.println( getFalse() || getTrue()  );
    System.out.println( getTrue()  || getFalse() ); // won't evaluate right side
    System.out.println( getTrue()  || getTrue()  );  // won't evaluate right side

    System.out.println( "Doing bitwise and");
    System.out.println( getFalse() & getFalse() );
    System.out.println( getFalse() & getTrue()  );
    System.out.println( getTrue()  & getFalse() );
    System.out.println( getTrue()  & getTrue()  );

    System.out.println( "Doing conditional (short-circuiting) and");
    System.out.println( getFalse() && getFalse() ); // won't evaluate right side
    System.out.println( getFalse() && getTrue()  );  // won't evaluate right side
    System.out.println( getTrue()  && getFalse() );
    System.out.println( getTrue()  && getTrue()  );
  }
}

所以在你的代码示例中它是什么意思?好吧,因为它是||,它是,如果第一个helper调用返回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]);

然而,||使得阅读比这更容易。

答案 6 :(得分:0)

每个递归函数都需要一个终点。你的是:

if (start >= nums.length) return sum1 == sum2;

它将返回true或false,具体取决于(sum1 == sum2)。

参见声明:

else {return (A || B); }

它将进入第一个子句,直到它返回TRUE或FALSE。如果它返回TRUE,则它是该行的结尾。否则,它将评估第二个子句并返回匹配(A || B)。

(TRUE || TRUE) -> TRUE
(TRUE || FALSE) -> TRUE
(FALSE || TRUE) -> TRUE
(FALSE || FALSE) -> FALSE