我正在尝试创建一个循环,该循环允许您使用“ x”个步长,每次跳过一个特定步长时,以1为增量递增。示例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
}
}
答案 0 :(得分:1)
你好,欢迎@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
,然后在 end 处返回结果,如下所示:
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
}
您可能会发现它很丑陋,而且确实冗长得多,但是最好弄清楚一些事情,即使只是为了自己,以后再重命名变量也是如此。
尽管尝试尝试,但要坚持下去。