首页 > 解决方案 > 尽管采取了非常相似的方法,为什么我会得到一个无限循环?

问题描述

  // loop 1, 2 etc
  var primeNums = [];
  for (var i = 2; i < num; i++) {
    // check if prime
    console.log('i ', i);
    var isNotPrime = false;
    for (var z = 2; z < i; z++) {
      // 7 / 2 is not factor or 7 == 7 prime
      if (i % z == 0 && i != z) {
        isNotPrime = true;
      }
      console.log('z', z, i);
    }
    if (isNotPrime == false) {
      primeNums.push(i)
    }
  }
  console.log(primeNums.reduce((add, current) => {
    return add += current;
  }));
  return primeNums.reduce((add, current) => {
    return add += current;
  });
}

sumPrimes(977);

此代码具有 primeNums 并检查每个向上计数的数字,对于每个数字,它检查每个向上计数的数字并检查它是否不是素数,如果是素数,则推送结果。

function sumPrimes(num) {
  // Helper function to check primality
  function isPrime(num) {
    for (let i = 2; i <= Math.sqrt(num); i++) {
      if (num % i == 0)
        return false;
    }
    return true;
  }

  // Check all numbers for primality
  let sum = 0;
  for (let i = 2; i <= num; i++) {
    if (isPrime(i))
      sum += i;
  }
  return sum;
}

此代码检查除数是否不给出浮点数,并将其作为每个数的函数运行,同时将素数相加。

为什么我的程序会出现无限循环?

我的是第一个代码块。

标签: javascriptloops

解决方案


您的代码中的问题是第二个 for 循环 if 条件。一旦条件被测试为真,您就永远不会打破循环。它循环到给定数字的整个范围

      if (i % z == 0 && i != z) {
        isNotPrime = true; // Need break statement after this.
      }

正如其他人指出的那样,计算结果花费的时间太长。
我们可以为程序做的优化

  • 除了 2 之外,所有偶数都不是素数,因此您始终可以将 for 循环增加 2,这需要我们计算 50% 的数字
  • 在第二个 for 循环中,您不需要检查数字的范围,而是只检查数字/2

这是我对您的代码的解决方案:

  var primeNums = [];
function sumPrimes(num) {
  
  for (var i = 3; i < num; i+=2) {
    // check if prime
    console.log('i ', i);
    var isNotPrime = false;
    for (var z = 2; z < i/2; z++) {
      // 7 / 2 is not factor or 7 == 7 prime
      if (i % z == 0 && i != z) {
        isNotPrime = true;
        break;
      }
      console.log('z', z, i);
    }
    if (isNotPrime == false) {
      primeNums.push(i)
    }
  }
  console.log(primeNums.reduce((add, current) => {
    return add += current;
  })+2);
  return primeNums.reduce((add, current) => {
    return add += current;
  }) + 2; // Add extra 2 since initial 2 is removed.
  
}

sumPrimes(977);

推荐阅读