为什么我的循环无限循环?

时间:2015-03-16 19:54:30

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

我正在编写一个函数,可以找到数字的素数因子。 在该函数中,它有两个循环。一个用于查找因子,另一个用于从第一个循环中查找素因子。第二个循环变得无限,我还没有发现循环中任何可以使其无限的。我在哪里错过了?

function findPrimeFactors(num)
{
 var factors = [];
 var primeFactors = [];
 var currIndex = 0;
 var initFactorsLen;
 var currCompose;
 for (i = 1; i <= num; ++i)
 {
  if (num % i == 0)
  {
   factors.push(i);
  }
 }
 var initFactorsLen = factors.length;
 for (i = 0; i <= initFactorsLen; ++i) 
 {
 //This is infinite loop
  console.log("i is " + i + " and factors are " + factors);
  currCompose = factors[i];
  var primeTest = isPrime(currCompose); 
  if (primeTest == true)
  {
   primeFactors.push(currCompose);
  }
 }
 return primeFactors;
}

function isPrime(num)
{
 var sqrtNum = Math.sqrt(num);
 var ceiledNum = Math.ceil(sqrtNum);
 if (num == 1 || num == 0)
 {
  return false;
 }
 else if (num == 2)
 {
  return true;
 }
 else
 {
  for (i = 2; i <= ceiledNum; ++i)
  {
   if (num % i == 0 && i != num)
   {
    return false;
   }
  }
  return true;
 }
}

我还注意到,有时候它并没有变得无限,但它只返回一个素数,尽管它有2个。(试试findPrimeFactors(143)

谢谢,

2 个答案:

答案 0 :(得分:4)

您的i循环变量是全局的,因此两个函数共享i的相同值。

初始化并使用var声明,如下所示:

for (var i = 0; i <= initFactorsLen; ++i)

在循环语句中声明它的另一种方法是使用其他变量声明它。请注意,您可以在逗号分隔的列表中声明所有变量,如下所示:

var factors = [],
    primeFactors = [],
    currIndex = 0,
    initFactorsLen,
    currCompose,
    i;

另请注意,您无需明确检查真相。这样:

var primeTest = isPrime(currCompose); 
if (primeTest == true) {
  primeFactors.push(currCompose);
}

......等同于:

var primeTest = isPrime(currCompose); 
if (primeTest) {
  primeFactors.push(currCompose);
}

......或者更简单:

if (isPrime(currCompose)) {
  primeFactors.push(currCompose);
}

答案 1 :(得分:1)

我不熟悉javascript ...你确定你的'i'不会被你的两个函数中的循环共享。如果在'isprime'函数中使用'k'作为索引会发生什么?

没关系,它在10分钟前解决了