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

我是编程新手,所以我一直在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个值之间交替,但我找不到任何提及返回|| 任何声明。

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

如果对helper()调用返回true则返回true。 这是相同的代码编写一个不同但function相同的方式:

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

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

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

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

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

可能写得更清楚:

 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 || falsetruefalse || false false || falsefalse等等

 return a || b; 

并不意味着:

 return a || return b; 

它实际上意味着:

 return (a || b); 

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

因此,如果abtrue (任一个或两个都为true ),它将return true 。 如果ab都是false那么它只会是假的。

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


编辑:您可以查看此测试代码 ,了解其工作原理的示例。

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

 +-------+-------+-------+ | 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 | whatever true | whatever正确的一面是true | whatever都是true无论正确的是false & whatever都是false false & whatever都是false的。 在这些情况下,我们实际上不需要知道右侧,或者我们甚至不需要进行生成该值的计算。 ||&&|相同 和&除了它不会评估超过它需要。 以下是您可以运行的小测试:

 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]); 

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

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

 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