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));

非常感谢任何帮助或澄清。谢谢!!

您得到了意想不到的结果,因为您正在更改 PrimeTest3i 的值。

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));