我试图通过尝试解决猴子/椰子/水手问题来尝试递归。
我的for循环停止有问题。它只是迭代,我不确定我哪里出错了。
在我的3个测试用例中,方法testCoconuts返回我想要的值,但是我的循环将迭代到最后一个数字,即使真值是通过循环发送的。
我确定它是我的布尔,但我还没弄清楚我做错了什么。
public class Test {
public static boolean testCoconuts(int s, int sr, int c){
if (c % s == 1 && sr > 0) {
Test.testCoconuts(s, sr - 1, c - (c/s) - 1);
}
else if (c % s != 1) {
return false;
}
else if (sr == 0) {
System.out.println("solved");
return true; //returns true in all 3 test cases below
}
return false;
}
public static void main(String[] args) {
//int s and sr must me entered into the test program
//as the same number, ex s= 2, sr = 2
int sailors = 3;
Test.testCoconuts(2, 2, 7); //will print solved
Test.testCoconuts(3, 3, 79); //will print solved
Test.testCoconuts(4,4,1021); //will print solved
for (int testNuts = 1; testNuts < 100; testNuts++) {
if (Test.testCoconuts(sailors, sailors, testNuts)==true) {
System.out.println("solved!");
break;
}
else {
System.out.println(testNuts);
System.out.println("next iteration");
System.out.println(testNuts);
}
}
}
}
答案 0 :(得分:2)
for循环将一直运行,直到testCoconouts
方法等于true。
现在,如果你看看这个方法,有四种可能的结果:
if (c % s == 1 && sr > 0)
else if (c % s != 1)
else if (sr == 0)
但是,只有在最后三个中你明确说明了该方法应返回的值。
所以 - 在第一个结果中,由于没有其他说法,该方法将始终返回false,如if语句之外所述。我假设你想从递归本身返回结果,对吗?
尝试更改这样的第一个if语句,看看会发生什么:)
if (c % s == 1 && sr > 0) {
boolean result = Test.testCoconuts(s, sr - 1, c - (c/s) - 1);
return result;
}
(可以在没有变量result
的单行中完成,但为了清晰起见我将其拆分了)
答案 1 :(得分:1)
请记住,您递归调用函数并返回上一个函数调用,而不是主函数
这是一个解决方案:
public class Test {
public static boolean testCoconuts(int s, int sr, int c){
boolean flag = false;
if (c % s == 1 && sr > 0){
flag = Test.testCoconuts(s, sr - 1, c - (c/s) - 1);
}
else if (c % s != 1){
return flag;
}
else if (sr == 0){
System.out.println("solved");
return true; //returns true in all 3 test cases below
}
return flag;
}
public static void main(String[] args){
//int s and sr must me entered into the test program
//as the same number, ex s= 2, sr = 2
int sailors = 3;
//Test.testCoconuts(2, 2, 7); //will print solved
//Test.testCoconuts(3, 3, 79); //will print solved
//Test.testCoconuts(4,4,1021); //will print solved
for (int testNuts = 1; testNuts < 100; testNuts++){
boolean flag = Test.testCoconuts(sailors, sailors, testNuts);
System.out.println(testNuts);
if (flag==true){
System.out.println("solved!");
break;
}
else{
System.out.println(testNuts);
System.out.println("next iteration");
System.out.println(testNuts);
}
}
}
}