我正在编写一个函数,可以找到数字的素数因子。 在该函数中,它有两个循环。一个用于查找因子,另一个用于从第一个循环中查找素因子。第二个循环变得无限,我还没有发现循环中任何可以使其无限的。我在哪里错过了?
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)
)
谢谢,
答案 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分钟前解决了