如何在递归函数中返回正确的布尔值?

时间:2018-04-30 06:48:50

标签: recursion return boolean terminate callstack

我知道递归函数的通用模板需要每个case的return语句。考虑这个递归函数,如果给定的整数列表可以通过算术运算符(*/+-,则应该(但不会)返回true )。

static boolean doArith(List<Double> A, double temp, int start) {
    // base case
    if (start == A.size()) return temp == 24;

    // recursive calls
    for (int op = 0; op < 4; op++) {
        doArith(A,
                arith(temp,op,A.get(start)),
                start+1);
    }

    return false;
}

通过基本案例块中的打印语句,我确信我的代码可以正确识别何时制作了24。但是,当调用堆栈结算时,它无法返回true。

我尝试重构代码,甚至将for循环硬编码为4个单独的调用,但正如预期的那样,这不起作用。

编辑:为了回应@Caramiriel评论)我尝试将函数重写为:

static boolean doArith(List<Double> A, double temp, int start) {
    // base case
    if (start == A.size()) return temp == 24;

    boolean b = false;
    // recursive calls
    for (int op = 0; op < 4; op++) {
        b = doArith(A,
                arith(temp,op,A.get(start)),
                start+1);
    }
    return b;
}

但这仍然会始终返回false

如何在遇到此类情况时让此函数返回true

由于

1 个答案:

答案 0 :(得分:1)

如果导致结果为24的操作,您知道答案是正确的并且需要从循环中断开:

static boolean doArith(List<Double> A, double temp, int start) {
    // base case
    if (start == A.size()) return temp == 24;

    // recursive calls
    for (int op = 0; op < 4; op++) {
        boolean b = doArith(A,
                arith(temp,op,A.get(start)),
                start+1);

        if(b) {
            return true;
        }
    }

    return false;
}

以下代码:

boolean b = false;
// recursive calls
for (int op = 0; op < 4; op++) {
    b = doArith(A,
            arith(temp,op,A.get(start)),
            start+1);
}

只检查最后一个案例(op = 3)。