JavaScript循环使用设定的步骤数,同时跳过特定步骤

时间:2019-05-07 04:10:52

标签: javascript loops

我正在尝试创建一个循环,该循环允许您使用“ 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
    }
}

1 个答案:

答案 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
}

您可能会发现它很丑陋,而且确实冗长得多,但是最好弄清楚一些事情,即使只是为了自己,以后再重命名变量也是如此。

尽管尝试尝试,但要坚持下去。