Javascript 为什么我的循环变成了无限循环?
我正在写一个函数,它将找到一个数的素数因子。 在这个函数中,它有两个循环。一个用于查找因子,另一个用于从第一个循环中查找素因子。第二个循环已经无限了,我没有发现循环中的任何地方可以使它无限。我错过了什么Javascript 为什么我的循环变成了无限循环?,javascript,arrays,for-loop,infinite-loop,prime-factoring,Javascript,Arrays,For Loop,Infinite Loop,Prime Factoring,我正在写一个函数,它将找到一个数的素数因子。 在这个函数中,它有两个循环。一个用于查找因子,另一个用于从第一个循环中查找素因子。第二个循环已经无限了,我没有发现循环中的任何地方可以使它无限。我错过了什么 function findPrimeFactors(num) { var factors = []; var primeFactors = []; var currIndex = 0; var initFactorsLen; var currCompose; for (i = 1;
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;
}
}
函数findPrimeFactors(num)
{
var因子=[];
风险价值因子=[];
风险价值指数=0;
var initFactorsLen;
变异系数;
对于(i=1;i您的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);
}
您的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分钟前解决的我不熟悉javascript…你确定你的两个函数中的循环没有共享你的“I”。如果你在函数“isprime”中使用“k”作为索引,会发生什么
不要紧,它是在10分钟前解决的,因为您正在使用,isPrime
会修改您的循环计数器。因为您正在使用,isPrime
会修改您的循环计数器。(!primeTest)是否意味着`isPrime(currcomose)`返回false?给定var primeTest=isPrime(currcomose);
,如果isPrime>(柯尔文)
为false,那么primeTest
将为false,并且!primeTest
将为true。那么,!primeTest将返回与实际值相反的值?!
否定表达式。那么!true
为false,并且!false
为true。谢谢,我已经搜索了一周。但是没有地方可以告诉我:ddos(!primeTest)表示'isPrime(currCompose)`返回false?给定var primeTest=isPrime(currCompose);
,如果isPrime(currCompose)
为false,那么primeTest
将为false,并且!primeTest
将为true。那么,!primeTest将返回与实际值相反的值?!
否定表达式。那么!true
为false,并且!false
为true。谢谢,我已经搜索了一周。但是没有任何地方可以告诉我:使用不同的表达式ent全局索引变量可以解决这个问题,但最好只使用局部变量来帮助防止这样的副作用。使用不同的全局索引变量可以解决这个问题,但最好只使用局部变量来帮助防止这样的副作用。