有人可以向我解释当我们进行下一次返回时,"或"(||)的含义是什么?
我的意思是这一行:
return cover (values, amount - values [index], index + 1) || cover (values, amount, index + 1);
public static boolean cover (int[] values, int amount) {
return cover(values,amount,0);
}
private static boolean cover (int[] values, int amount, int index) {
if (index >= values.length || amount == 0)
return (amount == 0);
else
return cover(values, amount - values[index], index+1)||cover(values, amount, index + 1);
}
答案 0 :(得分:1)
return cover (values, amount - values [index], index + 1) || cover (values, amount, index + 1);
如果true
返回cover (values, amount - values [index], index + 1)
,则会返回true
(如果发生这种情况,则会因为第二次调用而烦恼)或cover (values, amount, index + 1)
返回true
}}
答案 1 :(得分:1)
Java评估第一个子句,如果它返回true,则Java不评估第二个子句。如果第一个子句返回false,则Java会计算第二个子句。
简而言之:如果cover(values, amount - values [index], index + 1)
返回true,则不会执行cover(values, amount, index + 1)
。如果cover(values, amount - values [index], index + 1)
返回false,则执行cover(values, amount, index + 1)
。如果其中至少有一个返回true
答案 2 :(得分:1)
return cover(values, amount - values[index], index+1)||cover(values, amount, index + 1);
以上陈述与:
相同boolean result1 = cover(values, amount - values[index], index+1);
if(!result1) {
return cover(values, amount, index + 1);
} else {
return true;
}
当评估||
时,当第一部分评估为真时,第二部分不会被执行。因此,如果第一次调用cover()
返回true,则不会进行第二次调用。
答案 3 :(得分:0)
它是一个布尔析取。我不熟悉有问题的特定算法,但是在else分支中,你想要返回一个表达式或另一个(或两者)返回true。
private static boolean cover (int[] values, int amount, int index) {
if (index >= values.length || amount == 0)
return (amount == 0);
else
// First boolean expression OR second boolean expression
return cover(values, amount - values[index], index+1)||cover(values, amount, index + 1);
从概念上讲,另一种方法(没有短路评估*)将是:
private static boolean cover (int[] values, int amount, int index) {
if (index >= values.length || amount == 0)
return (amount == 0);
else {
boolean expr1 = cover(values, amount - values[index], index+1);
boolean expr2 = cover(values, amount, index + 1);
if (expr1 == true) return true;
if (expr2 == true) return true;
// None of them are true, so return false
return false;
}
虽然第二种方式显然过于冗长,但你可以通过使用析取运算符(||)以更清晰的方式完成它,它将执行相同的操作。
*请注意,在最初的示例中,使用析取运算符存在短路评估的情况。这意味着如果操作的第一个操作数返回" true",我们永远不需要计算第二个操作数。这使得整体表达式更有效,并且在诸如此类的递归算法中,它可以在性能上产生显着差异。