提问人:chiaseed 提问时间:9/7/2023 最后编辑:isherwoodchiaseed 更新时间:9/7/2023 访问量:32
为什么我在 if/else 语句中的嵌套 while 循环没有正确输出(无限循环)?
Why isn't my nested while loop in an if/else statement outputting correctly (infinite loop)?
问:
我在 if/else 语句中嵌入了两个循环(a while 和一个 if)。
我想检查用户输入是否是一个数字,如果不是,请设置用户可以重试(3 次)的次数限制,并在重复次数用完时提醒用户。如果用户从不输入数字,则返回 undefined。
或者,如果用户输入数字,请跳过检查并将该数字作为整数数据类型返回。
function monthlyBudget(count = 3) {
const SPEND = prompt("How much is your typical spend (in GBP) on books in a month? ");
// check if the input is not a number.
if (isNaN(SPEND)) {
while (count > 0) {
alert("Hmmm... I'm not sure I understood. Please try again.");
console.log("Spend input is not a number.");
count--
console.log(count)
monthlyBudget(count);
}
// if SPEND is not a number and count = 0.
if (count == 0) {
alert("Oh no! We are unable to process your request, please try again later.");
return undefined
}
} else {
return Number(SPEND)
}
}
但似乎它会一直到计数 = 0 并输出计数 = 0 警报,但随后它会返回并立即输出“嗯......我不确定我是否理解。请再试一次“,然后回到”哦,不!我们无法处理您的请求,请稍后再试。
console.log 显示一旦计数达到 0,它会再次回到 1,然后再回到 0,因此警报与计数匹配,但我不确定为什么这段代码会这样做?
谁能指出我哪里出了问题?
在我第一次尝试时,if/else 语句看起来略有不同:
if (isNaN(SPEND)) {
alert("Hmmm... I'm not sure I understood. Please try again.");
console.log("Spend input is not a number.");
monthlyBudget();
} else {
return Number(SPEND);
}
但是,如果第一个输入(或后面的输入)是一个字符串,则无论下一个输入是什么,该函数都只会返回第一个字符串输入。
我不确定为什么,因为没有回报,我不确定这是否仍然是第一个块中的代码问题,因为我认为我陷入了无限循环。if (isNaN(SPEND))
答:
您尝试通过循环和递归来实现循环。这是有问题的。此外,当您进行递归调用时,您将忽略此递归调用可能返回的答案。你应该这样做,而不是再次循环。while
return
所以改变这个:
monthlyBudget(count);
自:
return monthlyBudget(count);
现在你也可以用 替换它,因为它确定你会执行它。那里没有第二次迭代。重复是通过递归调用实现的,而不是循环。while
if
return
while
注意:通过 和 询问用户输入不是好的做法。为此,请使用 HTML 输入控件。prompt
alert
使用迭代,无递归
将呼叫放入循环中,并在接受号码时退出循环(因此是相反的测试)。如果循环退出,则表示所有重试都已使用,但未成功,是时候显示最终警报了。prompt
if
一些评论:
不要对接受用户输入的变量使用 ALL CAPS。通常的做法是将 ALL CAPS 的使用保留给代码中定义的常量。
用分号分隔所有语句。
我离开了 ,显然你被要求用于这个练习:prompt
alert
function monthlyBudget(count = 3) {
while (count > 0) {
let spend = prompt("How much is your typical spend (in GBP) on books in a month? ");
// check if the input is a number: if so return it (exiting)
if (!isNaN(spend)) {
return Number(spend);
}
alert("Hmmm... I'm not sure I understood. Please try again.");
console.log("Spend input is not a number.");
count--;
console.log(count);
}
// We get here when input is not a number and count = 0.
alert("Oh no! We are unable to process your request, please try again later.");
// return undefined is the default, so we can leave it out.
}
const budget = monthlyBudget();
console.log("the user provided this input:", budget);
评论
prompt
alert
while
评论