我正在编写一个函数,它将找到一个数字的主要因素。在这个函数中,它有两个循环。一个用于寻找因子,另一个用于从第一个循环中寻找素因子。第二个循环已经无限大了,我还没有在循环中发现任何可能使其无限的地方。我错过了哪里?
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))
谢谢,
发布于 2015-03-16 19:58:34
您的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);
}发布于 2015-03-16 20:12:35
我不熟悉javascript..。您是否确定您的“i”在您的两个函数中不被循环所共享。如果在函数“isprime”中使用“k”作为索引会发生什么?
算了,10分钟前就解决了
https://stackoverflow.com/questions/29085784
复制相似问题