我是编程新手,所以我一直在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个值之间交替,但我找不到任何提及返回||任何声明。
答案 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 || false
为true
,false || false
为false
等。
答案 4 :(得分:0)
return a || b;
不意味着:
return a || return b;
实际上意味着:
return (a || b);
它会评估a || b
,然后返回结果:
因此,如果a
或b
为true
(其中一个或两者都是true
),那么它将return true
。如果false
和a
均为假,则只有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 | whatever
是true
无论右边是什么,false & whatever
是false
无论右边是什么。在这些情况下,我们实际上不需要知道右侧,或者我们甚至不需要进行生成该值的计算。 ||
和&&
与|
和&
相同,但不会评估超出其需要的内容。以下是一项小型测试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