递归 - 返回(方法(...)||方法(...))

时间:2015-02-19 23:36:04

标签: java

有人可以向我解释当我们进行下一次返回时,"或"(||)的含义是什么?

我的意思是这一行:

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

}

4 个答案:

答案 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

,则结果为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",我们永远不需要计算第二个操作数。这使得整体表达式更有效,并且在诸如此类的递归算法中,它可以在性能上产生显着差异。