为什么这个函数会创建一个无限的looop?

时间:2017-01-26 05:48:28

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

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

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);

3 个答案:

答案 0 :(得分:3)

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

由于第一个函数在完成时将 i 设置为 num-1 ,而 num i的值在执行之前,它有效地减少 i 。因此 i 将在第二个函数的循环的下一次迭代中获得相同的值,永远不会前进。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

&#13;
&#13;
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);
&#13;
&#13;
&#13;