为什么我的循环变成了无限循环?
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分钟前就解决了
我正在编写一个函数来查找数字的质因数。 在那个函数中,它有两个循环。一个用于查找因子,另一个用于从第一个循环中查找主要因子。第二个循环变成了无限循环,我还没有在循环中发现任何可以使它无限循环的地方。我错过了哪里?
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分钟前就解决了