for循环无意中破坏了if语句

时间:2015-04-28 18:20:04

标签: javascript if-statement for-loop primes

我试图通过从最大可能因素向后工作来确定数字的最大素数因子。一旦找到一个因子,我通过在原始函数中使用PrimeTest3函数来测试它是否是素数。

然而,它并没有给出我期望的数字13195的答案。当我使用'测试代码如上所示时,这通过了测试'声明,我可以看到它从找到的第一个因子(2639)跳到最后找到的因子(5),奇怪的是,当记录通过PrimeTest3传递i的结果时,它显示为false,即使它有首先传递if语句是真的。

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

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

2 个答案:

答案 0 :(得分:2)

for内的PrimeTest3循环使用与i中的循环相同的变量largestPrimeFactor3。您需要使用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));

答案 1 :(得分:0)

由于您正在更改iPrimeTest3的值,因此您会收到意外结果。

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变量本地化,以便不会更改i函数范围之外的其他PrimeTest3变量。

在您处理此问题时,请limit执行PrimeTest3而不只是var limit = ...,将limit = ...本地化为ManipulationMode