javascript - 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
}
}
解决方案
您好,欢迎@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
s 结束。
还有其他更短,可能更聪明的方法来解决这个问题,但我的目标是坚持你的公式。
不是您必须关心的事情,但如果您想看到,经验丰富的程序员可能会以这种方式“重构”您的代码:
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
}
你可能会觉得它很丑,而且确实更冗长,但最好把事情说清楚,即使只是为了你自己,以后你重命名变量。
固然尝试,坚持下去。
推荐阅读
- python - 图像分类:TypeError:'bool' 对象不可迭代
- gremlin - TinkerPop 没有通过遍历获得正确的计数类型
- r - 如何构建自动更新的拖放分层树
- vidyo - 是否有任何解决方案可以继续在 vidyo.io 库中进行低带宽电话会议?
- vba - 将Word表格复制到Excel并格式化为表格
- scala - Scala Spark 数据集更改类类型
- iphone - 在 xcode 连接到笔记本电脑时自动选择真实设备
- c++ - 如何在 C++ 程序中创建快捷方式(键盘输入,例如“Alt”或“Shift”)
- python - 如何在大熊猫 DataFrame 中将 3 列的组连接成一个?
- java - Eclipse Java - 对于每一行循环