【问题标题】:Not sure why my limit is not being reached不知道为什么没有达到我的限制
【发布时间】:2020-01-06 11:50:20
【问题描述】:

我似乎无法达到最大应为 20 的变量的限制。有一个内部循环应该测试 1 到 20 之间的所有数字是否可以除以外部循环中的变量,没有任何小数位- 所以整数。当limit = 20时,我从外循环返回,并且我知道的外变量可以除以内循环的每次迭代。似乎很容易。 Vscode 并没有走多远,我从来没有超过 limit = 10。看起来我的 vs 编译器刚刚触底。

有什么想法吗?非常感谢...

let starter = 2520;
let limit = 0;

while (limit < 20) {
  let i = 1;

  while (i <= 20) {
    if (starter % i !== 0) {
      limit = 0;
      break;
    }
    limit = i;
    i++;
  }
  if (limit === 20) {
    return starter;
  }
  starter++;
}

应该在

退出
limit === 20

【问题讨论】:

  • 你正在搜索的数字,可以被 1 到 20 之间的所有整数整除,是 232792560 (2*2*2*2*3*3*5*7*11*13*17*19 ) - 这需要相当多的迭代!
  • @Bergi 您是如何/在哪里成功运行此代码的?如果您是正确的,它可以正常运行,那么问题可能真的只是 OP 所暗示的 VSCode?​​span>
  • @DanFriedman 我只是把它放在我的 Chrome devtools 控制台中(花了几秒钟 - 不是永恒,但仍然如此)。是的,我的猜测是在 vscode 调试器中运行代码,即使启用了一些断点,也会大大减慢速度。 (要查看limit11,必须进行27720 - 2520 迭代)
  • 在不解决问题的情况下,我是否可以建议您始终将starter 增加20

标签: javascript while-loop visual-studio-code


【解决方案1】:

主要问题是您在 while 循环中使用了 return 语句,而实际上没有 break 循环。

请记住,return 用于返回调用它的步骤,而break 用于结束循环。

话虽如此,你应该首先break循环,然后return你需要返回的内容。

如果您将代码中唯一出现的return 替换为break,您将能够在starter 变量中看到结果。

let starter = 2520;
let limit = 0;

while (limit < 20) {
  let i = 1;

  while (i <= 20) {
    if (starter % i !== 0) {
      limit = 0;
      break;
    }
    limit = i;
    i++;
  }
  if (limit === 20) {
    break; // Use break, not return
  }
  starter++;
}

console.log(limit)
console.log(starter)

limit === 20 时会结束while循环。

正如@Bergi 所提到的,如果您的代码位于函数中,那么您可以将console.log(starter) 替换为return starter

【讨论】:

  • 你必须假设这段代码放在function中,当然return会在那里爆发。
  • @Bergi 是的,但 return starter 在主 while 循环之后应该这样做。
  • 不,OP 想要在增加之前return starter。你必须在循环之后做return starter - 1
  • @Bergi 和break 语句正是这样做的。它直接跳到主 while 循环之外。这就是您可以从starter 读取结果的原因。
  • 这是一个很好的答案。当然-为什么我要返回但不在函数中,通常我是-这就是原因。一旦我将 return 替换为 break 我就达到了极限。谢谢@k3llydev
【解决方案2】:

思考过程:

  1. limit 设置在 3 个位置。两次设置为0,只有一次设置为i
  2. i 在外部while 的开头声明,并始终重置为1
  3. 所以limit 到达20 的唯一方法是让i 在外循环的一次迭代内到达20
  4. i 仅在内循环中递增,因此 i 必须在内循环内达到 20
  5. 为了达到20i 必须对每个测试的数字(即 1..20)均分到 starter。我猜这永远不会发生。
  6. 只有在limit大于等于20时才能退出,所以程序处于无限循环中。

如果您添加一些 console.log 语句或单步执行代码,您会发现问题。

【讨论】:

  • 这不是一个无限循环。您可以尝试运行它:结果是232792560。除了您在#5中的猜测之外,您的所有陈述都是正确的分析:-)
  • 啊,你是对的。我没有发现 starter 正在增加。所以它感觉就像无限(永恒)并且已经让我尝试过的在线 JavaScript 运行器崩溃了。 :)
  • 是的,这也是我的第一个猜测:2520 不能被所有这些数字整除,所以这是一个无限循环 - 直到我注意到 starter++...
猜你喜欢
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-21
  • 2014-01-28
  • 1970-01-01
  • 2023-02-05
  • 2019-11-12
相关资源
最近更新 更多