我正在尝试创建一个循环,允许您每次使用“x”步数递增一个,同时跳过特定步骤。示例 1 是您有 2 个操作,需要跳过步骤 2。因此您将从 0 转到 1,然后 1 到 3。示例 2 是您有 3 个操作,需要跳过步骤 3,因此您可以从 0 转到到 1,等待 1 轮,然后从 1 到 4,因为你会跳过两轮。或者您可以在 0 处等待,然后跳到 2,然后跳到 5。
我知道我将继续使用 while 循环,但它并没有像预期的那样工作。
function maxStep(n, k) {
let step = n
let bad = k
let total = 0
while (total <= step) {
total += 1
if (total === bad) {
continue;
}
total += 1
return total
}
}
最佳答案
您好,欢迎@jaronow!
首先,continue
跳转到 while
的下一次迭代.所以你在这里写的...
if (total === bad) {
continue;
}
total += 1
...实际上是说,“如果步数不好,则跳过加 1。”但您的意思恰恰相反,不是吗?
if (total === bad) {
total += 1
}
现在说,“如果步数不对,再添加 1。” 好了,现在我们有了
function maxStep(n, k) {
let step = n
let bad = k
let total = 0
while (total <= step) {
total += 1
if (total === bad) {
total += 1 // Put this here instead of continue.
}
return total
}
}
现在,你把它放在哪里很奇怪:
return total
这实际上是在第一次遇到时退出整个函数。当然你的意思是计算total
根据需要多次运行循环,然后在结束返回结果,如下所示:
function maxStep(n, k) {
let step = n
let bad = k
let total = 0
while (total <= step) {
total += 1
if (total === bad) {
total += 1
}
}
return total // Moved this out.
}
最后,还有两个微妙的问题(稍后注意到第二个)。首先,如果您因为遇到错误步骤而采取“额外步骤”,则需要增加 step
同样,因为它是您计划采取的最大步数。而且,一旦达到该步数,您就不想再次进入循环并向 total
添加另一个 , 所以你需要使用 <
而不是 <=
. (你会发现这是编程中的一个常见模式,当你打算做 N 次时,你写你的循环说 < N
,而不是 <= N
。)
function maxStep(n, k) {
let step = n
let bad = k
let total = 0
while (total < step) {
total += 1
if (total === bad) {
total += 1
step += 1 // Add this.
}
}
return total
}
否则,您的 total
将始终以 step
的原始数字结束
还有其他更短、可能更聪明的方法可以解决这个问题,但我的目标是通过坚持您的表述来进行教学。
这不是你必须关心的事情,但如果你想看到,经验丰富的程序员可能会这样“重构”你的代码:
function getStepsTaken(desiredStepsToTake, badNumberOfSteps) {
let stepsToTake = desiredStepsToTake
// let bad = k (don't need this line)
let stepsTaken = 0
while (stepsTaken < stepsToTake) {
stepsTaken += 1
if (stepsTaken === badNumberOfSteps) {
stepsTaken += 1
stepsToTake += 1
}
}
return stepsTaken
}
您可能会觉得它很丑陋,而且确实更冗长,但最好还是把事情弄清楚,即使只是为了您自己,您稍后会重命名变量。
尽管是一次坚实的尝试,请继续努力。
关于JavaScript 循环使用设定数量的步骤,同时跳过特定步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56015444/