为什么我的循环变成了无限循环?

Why does my loop gone infinite loop?

我正在编写一个函数来查找数字的质因数。 在那个函数中,它有两个循环。一个用于查找因子,另一个用于从第一个循环中查找主要因子。第二个循环变成了无限循环,我还没有在循环中发现任何可以使它无限循环的地方。我错过了哪里?

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

我也注意到有时它不是无限的,但它 returns 只有一个质数,尽管它有 2 个。(尝试 findPrimeFactors(143)

谢谢,

您的 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);
}

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

没关系,10分钟前就解决了