【问题标题】:How to return correct boolean in recursive function?如何在递归函数中返回正确的布尔值?
【发布时间】:2018-10-10 05:46:06
【问题描述】:

我知道递归函数的通用模板需要针对每种情况的 return 语句。考虑这个递归函数,如果给定的整数列表可以通过算术运算符(*,/,+,-)得到 24,它应该(但不能)返回 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

谢谢

【问题讨论】:

  • 您没有在循环内处理来自doArith() 的结果值。
  • 我试过了,但没用。我会将其添加到编辑中
  • 在for循环中,检查b是否为真,返回b

标签: recursion return boolean terminate callstack


【解决方案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)。

【讨论】:

  • 太棒了!你能解释一下为什么只检查op = 3 吗?前三个电话不重要吗?谢谢:)
  • 因为您在上一个示例中为每个循环迭代覆盖了变量 b。最后一个值是唯一保留的值。当doArith 被执行并且结果被分配给b 时,循环的下一次迭代将被执行,因此b 的值不再相关,因为它无论如何都会被覆盖。唯一剩下的值是循环中的最后一个值。
猜你喜欢
  • 2020-07-25
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 2021-01-06
  • 1970-01-01
  • 2018-08-11
相关资源
最近更新 更多