首页 > 解决方案 > JavaScript 在跳过特定步骤时使用设定数量的步骤循环

问题描述

我正在尝试创建一个循环,该循环允许您在跳过特定步骤时每次使用“x”个步骤以递增一个。示例 1 是您有 2 个操作,需要跳过第 2 步。所以您将从 0 到 1,然后从 1 到 3。示例 2 是您有 3 个操作,需要跳过第 3 步,所以您可以从 0 开始到 1,等待 1 轮,然后从 1 转到 4,因为你会跳过两个。或者你可以在 0 等待,然后跳到 2,然后跳到 5。

我知道我很接近使用带有 continue 的 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
    }
}

标签: javascriptloops

解决方案


您好,欢迎@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将始终以原始数量steps 结束。

还有其他更短,可能更聪明的方法来解决这个问题,但我的目标是坚持你的公式。


不是您必须关心的事情,但如果您想看到,经验丰富的程序员可能会以这种方式“重构”您的代码:

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
}

你可能会觉得它很丑,而且确实更冗长,但最好把事情说清楚,即使只是为了你自己,以后你重命名变量。

固然尝试,坚持下去。


推荐阅读