我知道递归函数的通用模板需要每个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
?
由于
答案 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
)。