【问题标题】:Why is this function creating an infinite looop?为什么这个函数会创建一个无限循环?
【发布时间】:2017-01-26 05:48:27
【问题描述】:

第一个函数确定一个数是否为素数。第二个函数应该创建一个包含所有质数直到最大值并包括最大值的数组,但由于某种原因它给了我一个无限循环。

function isPrime(num) {
  for (i = 2; i < num; i++) {
    if (num % i === 0) {
      return false
    }
  }
  if (num <= 1) {
    return false;
  }
  return true;
}

function primes(max) {
  var all = [];
  for (i = 2; i <= max; i++) {
    if (isPrime(i)) {
      all.push(i);
    }
  }
}

primes(17);

【问题讨论】:

标签: javascript loops for-loop infinite-loop prime-factoring


【解决方案1】:

您的 i 变量是全局变量,因此两个函数使用相同的 i。这意味着第一个函数会在第二个函数循环时更改它。

因为第一个函数将在完成时将 i 设置为 num-1,而 numi 的值 在执行它之前,它实际上将 i 减一。所以 i 将在第二个函数的循环的下一次迭代中获得相同的值,永远不会前进。

通过将var 关键字放在两个函数中来解决此问题。

for(var i=2; // ...etc) 

【讨论】:

    【解决方案2】:

    两个循环中的变量i 是全局变量,它们相互覆盖,所以第一个循环永远不会结束。

    【讨论】:

      【解决方案3】:

      在你的代码中,问题是变量 i 的范围,在素数没有计算时,你可以检查到 no 的 sqrt,如果 no 不能被任何 no 整除,直到它的 sqrt,那么它将是素数不,试试这个:

      function isPrime(num) {
        let k = Math.sqrt(num);
        for (let i = 2; i <= k; i++) {
          if (num % i === 0) {
            return false
          }
        }
        return true;
      }
      
      function primes(max) {
        let all = [];
        for (let i = 2; i <= max; i++) {
          if (isPrime(i)) {
            all.push(i);
          }
        }
        console.log(all)
      }
      
      primes(17);
      primes(25);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-14
        • 2018-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-22
        • 2014-11-19
        相关资源
        最近更新 更多