gpt4 book ai didi

Java新手: Return parameter not reassigned after recursive loop

转载 作者:行者123 更新时间:2023-12-02 08:38:53 25 4
gpt4 key购买 nike

    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

输入一些无效条目后,返回的参数不会重新分配有效条目。输出示例:

User, 1,U
User, 2,I
User, 3,O
User, 4,P
User, 5,M
User, 6,A
User Answer:U
CorrectAnser:A
false

如您所见,“U”是第一个条目,最后一个“A”是逃脱循环的条目。虽然返回的是“U”而不是“A”。不明白为什么?

最佳答案

正如 Ivar 在评论中所说,您不会在 switch 语句的 default 部分返回答案。您需要说return Ask(question),而不是仅仅调用ask(question)。然后,底部的return answer部分将不再需要. 请参阅下面的代码(我还对其进行了一些修改,使其看起来更美观)。

您应该意识到,当您再次调用该方法时,return 语句仅从最后一次方法调用返回。因此,在原始方法调用中,ask(question) 的结果将被忽略(实际上就像调用 void 方法)。 Return 语句不会返回到堆栈中的第一个方法。这就是为什么您需要默认返回的原因。

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)
}
}

变成一个循环,这将是:

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;

假设您有一个函数,它接受 2 个字符串,对它们进行哈希处理,然后如果第一个字符串的哈希码大于第二个字符串的哈希码,则返回 true。

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
}

如您所见,当您第一次调用 hash 方法并返回 int 时,这并不意味着 compareHashCodes 也会立即返回一个 int。它只是将该 int 存储到变量 hash1 中。当您将 hashCode 放入 hash2 中时,第二次也会发生同样的情况。第三次,hash(s1) 的值被忽略,而不是返回,因为从应该返回 boolean 值的方法中返回整数是没有意义的。仅当到达最终语句 return hash1 > hash2 时,方法 compareHashCodes 才会实际返回。

关于Java新手: Return parameter not reassigned after recursive loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61509562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com