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

标签 javascript loops

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

相关文章:

JavaScript - 根据另一个对象的匹配属性返回数组的索引

javascript - 仅在父 div 上悬停效果

javascript - 如何使用 gRaphael 折线图设置 x 轴的日期值

c - 简单的程序检查 ip - scanf 段错误

ruby - 在 Ruby 中将成对的数组元素混合在一起的最佳方法

javascript - Node.js HTTP 流请求与 Express.js 请求对象

javascript - 如何将变量值作为文档的 ID GetElementByID 传递

php - 使用循环仅显示每个 DISTINCT 字段值一次

javascript - 单击按钮时连续重复翻转动画?

java - 并发修改异常 : Why does removing the null in List throw this Exception if it´s not the first variable