Я пишу функцию, которая найдет простые множители числа. В этой функции он имеет две петли. Один для нахождения факторов, другой для нахождения основных факторов из первого цикла. Второй цикл прошел бесконечно, я не заметил нигде в цикле, который мог бы сделать его бесконечным. Где я пропустил?Почему моя петля ушла в бесконечный цикл?
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)
)
Спасибо,
Поскольку вы используете [глобальные переменные все более кода] (http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals .html), а 'isPrime' изменяет ваш счетчик циклов. – Bergi