for 循环无意中中断 if 语句
for loop unintentionally breaking at if statement
我试图通过从最大可能因子向后计算来确定一个数的最大质因数。找到因子后,我会使用原始函数中的 PrimeTest3 函数测试它是否为素数。
但是,它没有给出我期望的数字 13195 的答案。当我使用 'this passed the test' 语句测试上面显示的代码时,我可以看到它跳过了第一个因素找到 (2639) 到找到的最后一个因子 (5),奇怪的是,当记录通过 PrimeTest3 传递 i 的结果时,它显示为 false,即使首先传递 if 语句必须为 true .
var largestPrimeFactor3 = function (num) {
function PrimeTest3(a){
if (a<=1 || a%1!=0)
return false;
limit = Math.ceil(Math.pow(a,.5));
if (a%2==0 || a%3==0)
return false;
if (a==2 || a==3)
return true;
for (i=6;i<limit;i+=6){
if (a%(i-1)==0)
return false;
if (a%(i+1)==0)
return false;
}
return true;
}
for(var i = Math.floor(num/2); i>0; i--){
console.log(i);
if(num % i === 0 && PrimeTest3(i)){
console.log('this passed the test:' + PrimeTest3(i));
return true;
}
}
}
console.log(largestPrimeFactor3(13195));
非常感谢任何帮助或澄清。谢谢!!
您得到了意想不到的结果,因为您正在更改 PrimeTest3
中 i
的值。
if(num % i === 0 && PrimeTest3(i)){ // i changed in PrimeTest3
// now i is not what it was when originally passed in PrimeTest3
console.log('this passed the test:' + PrimeTest3(i));
解决方法是更改:
for (i=6;i<limit;i+=6){
收件人:
for (var i=6;i<limit;i+=6){
这将本地化 i
变量,不会更改 PrimeTest3
函数范围之外的另一个 i
变量。
当你在做的时候,通过 var limit = ...
而不是仅仅 limit = ...
.
将 limit
本地化到 PrimeTest3
的范围
PrimeTest3
中的 for
循环使用与 largestPrimeFactor3
中的循环相同的变量 i
。您需要使用 var
声明将此变量声明为内部函数的局部变量。
var largestPrimeFactor3 = function (num) {
function PrimeTest3(a){
if (a<=1 || a%1!=0)
return false;
limit = Math.ceil(Math.pow(a,.5));
if (a%2==0 || a%3==0)
return false;
if (a==2 || a==3)
return true;
for (var i=6;i<limit;i+=6){
if (a%(i-1)==0)
return false;
if (a%(i+1)==0)
return false;
}
return true;
}
for(var i = Math.floor(num/2); i>0; i--){
console.log(i);
if(num % i === 0 && PrimeTest3(i)){
console.log('this passed the test:' + PrimeTest3(i));
return true;
}
}
}
console.log(largestPrimeFactor3(13195));
我试图通过从最大可能因子向后计算来确定一个数的最大质因数。找到因子后,我会使用原始函数中的 PrimeTest3 函数测试它是否为素数。
但是,它没有给出我期望的数字 13195 的答案。当我使用 'this passed the test' 语句测试上面显示的代码时,我可以看到它跳过了第一个因素找到 (2639) 到找到的最后一个因子 (5),奇怪的是,当记录通过 PrimeTest3 传递 i 的结果时,它显示为 false,即使首先传递 if 语句必须为 true .
var largestPrimeFactor3 = function (num) {
function PrimeTest3(a){
if (a<=1 || a%1!=0)
return false;
limit = Math.ceil(Math.pow(a,.5));
if (a%2==0 || a%3==0)
return false;
if (a==2 || a==3)
return true;
for (i=6;i<limit;i+=6){
if (a%(i-1)==0)
return false;
if (a%(i+1)==0)
return false;
}
return true;
}
for(var i = Math.floor(num/2); i>0; i--){
console.log(i);
if(num % i === 0 && PrimeTest3(i)){
console.log('this passed the test:' + PrimeTest3(i));
return true;
}
}
}
console.log(largestPrimeFactor3(13195));
非常感谢任何帮助或澄清。谢谢!!
您得到了意想不到的结果,因为您正在更改 PrimeTest3
中 i
的值。
if(num % i === 0 && PrimeTest3(i)){ // i changed in PrimeTest3
// now i is not what it was when originally passed in PrimeTest3
console.log('this passed the test:' + PrimeTest3(i));
解决方法是更改:
for (i=6;i<limit;i+=6){
收件人:
for (var i=6;i<limit;i+=6){
这将本地化 i
变量,不会更改 PrimeTest3
函数范围之外的另一个 i
变量。
当你在做的时候,通过 var limit = ...
而不是仅仅 limit = ...
.
limit
本地化到 PrimeTest3
的范围
PrimeTest3
中的 for
循环使用与 largestPrimeFactor3
中的循环相同的变量 i
。您需要使用 var
声明将此变量声明为内部函数的局部变量。
var largestPrimeFactor3 = function (num) {
function PrimeTest3(a){
if (a<=1 || a%1!=0)
return false;
limit = Math.ceil(Math.pow(a,.5));
if (a%2==0 || a%3==0)
return false;
if (a==2 || a==3)
return true;
for (var i=6;i<limit;i+=6){
if (a%(i-1)==0)
return false;
if (a%(i+1)==0)
return false;
}
return true;
}
for(var i = Math.floor(num/2); i>0; i--){
console.log(i);
if(num % i === 0 && PrimeTest3(i)){
console.log('this passed the test:' + PrimeTest3(i));
return true;
}
}
}
console.log(largestPrimeFactor3(13195));