Java Newb:递归循环后未重新分配返回参数
输入几个无效条目后,返回的参数没有使用有效条目重新分配。输出示例:Java Newb:递归循环后未重新分配返回参数,java,return,Java,Return,输入几个无效条目后,返回的参数没有使用有效条目重新分配。输出示例: static String ask(String question) { String Answer = JOptionPane.showInputDialog(question); Answer = Answer.toUpperCase(); System.out.println("User, " + counter +"," + Answer); // for de
static String ask(String question) {
String Answer = JOptionPane.showInputDialog(question);
Answer = Answer.toUpperCase();
System.out.println("User, " + counter +"," + Answer); // for debugging purposes
counter += 1; // for debugging purposes
switch (Answer){
case "A":
return(Answer);
case "B":
return(Answer);
case "C":
return(Answer);
case "D":
return(Answer);
case "E":
return(Answer);
default:
JOptionPane.showMessageDialog(null, "Invalid Answer. Please Enter A,B,C,D,or E:");
ask(question);
// when invalid option entered, we loop back to beginning of method - Answer not being reassigned
}
return(Answer); // I don't need this, Java won't let me run without it
如您所见,“U”是第一个条目,而最后一个“A”是逃离循环的条目。虽然返回的是“U”,而不是“A”。但我不知道为什么?正如Ivar在评论中所说,您没有在switch语句的
默认部分返回答案。你需要说return ask(question
,而不是仅仅调用ask(question)
。然后,底部的return-answer
部分就不需要了。请看下面的代码(我也对它做了一些修改,使它看起来更美观)
您应该意识到,当您再次调用该方法时,return语句仅从上次的方法调用返回。因此,在您最初的方法调用中,ask(question)
的结果被忽略(实际上就像调用一个void方法).Return语句不会返回到堆栈中的第一个方法。这就是为什么在默认值中需要返回
User, 1,U
User, 2,I
User, 3,O
User, 4,P
User, 5,M
User, 6,A
User Answer:U
CorrectAnser:A
false
变成一个循环,这将是:
static String ask(String question) {
String answer = JOptionPane.showInputDialog(question).toUpperCase();
System.out.println("User, " + counter +"," + answer); // for debugging purposes
counter += 1; // for debugging purposes
switch (answer) {
case "A":
case "B":
case "C":
case "D":
case "E":
return answer;
default:
JOptionPane.showMessageDialog(null, "Invalid Answer. Please Enter A,B,C,D,or E:");
return ask(question);
// when invalid option entered, call method again (btw, you're not looping back, it's just recursion)
}
}
假设您有一个函数,它接受两个字符串,对它们进行散列,然后如果第一个字符串的散列码大于第二个字符串的散列码,则返回true
static String ask(String question) {
String result = question;
do {
String answer = JOptionPane.showInputDialog(question).toUpperCase();
switch (answer) {
case "A":
case "B":
case "C":
case "D":
case "E":
result = answer;
break;
default:
JOptionPane.showMessageDialog(null, "Invalid Answer. Please Enter A,B,C,D,or E:");
}
} while (result == question); //I know, I know, I'm using "==". But it should be fine because question is assigned to it at the start
return result;
如您所见,当您第一次调用hash
方法并返回一个int
时,这并不意味着compareHashCodes
也会立即返回一个int。它只会将该int存储到变量hash1
中。第二次,当您将hashCode放入hash2
中时,也会发生同样的情况ird时间,hash(s1)的值
被忽略,而不是返回,因为从一个isi应该返回布尔值的方法返回INT是没有意义的。只有当到达最终语句return hash1>hash2
时,方法compareHashCodes
才实际返回。您没有对在递归中返回的值执行任何操作rsive call.return ask(question)
。如果您不需要返回答案,那么您的方法将type返回为void。您的代码风格一开始就让我感到不舒服。请查看标准Java编码风格建议:-变量名称应以小写字母开头(答案-非答案)您不需要用括号括住返回:return-answer;-只是一个帮助注释。最后一个返回是必需的,因为您声明了要返回字符串的方法。您可能会在switch语句中输入默认值,但不返回任何内容,Java编译器也会要求您有一个返回语句仍在swtich块之外。不应到达最后一个返回,每种情况都有一个返回语句,默认情况下是递归。返回询问(问题)
正在将问题发送回方法以获取新的有效输入…我可能语法不正确,这就是我要问的。好的,我想我开始理解了…我理解递归函数调用的工作方式类似于循环,会再次启动整个函数,但我缺少的是它会从m默认,并保持默认状态,等待进一步的指令,因此需要返回。@denver coder-
public boolean compareHashCodes(String s1, String s2) {
int hash1 = hash(s1), hash2 = hash(s2);
hash(s1);
return hash1 > hash2;
}
public int hash(String s) {
return s.hashCode(); //or something else
}