Prime Factors功能崩溃控制台

时间:2014-08-23 20:19:47

标签: javascript

我无法弄清楚为什么这段代码会崩溃我的控制台:

var isPrime = function(n) {
    for (i=2;i<n;i++) {
        if (n % i === 0) {
            return false;
            break
        } else {
            return true
        }
    }
};
var primeFactors = function(n) {
    factorsArray = [];
    for (i=0;i<n;i++) {
        if (isPrime(i)) {
            if (i % n === 0) {
                factorsArray.push(i);
            }
        }
    }
    return factorsArray
}

当我单独运行“isPrime”功能时,它运行得很好。但是,primeFactors函数(对于任何大于3的值)将使控制台崩溃。我不知道它是如何成为一个无限循环。可能不是解决问题的最有效方法,但我认为它应该仍然有效......

3 个答案:

答案 0 :(得分:1)

这是我的版本。修正了一些严重错误并引入了一些优化。请注意,我已手动修改了代码,因此可能存在一些语法问题:

var isPrime = function (n) {
    if (n == 2) return true;           //2 is prime
    if (n % 2 == 0) return false;      //other even numbers are not prime

    //try division upto the square-root of the given number. If we don't find
    //a divisor, the number is prime.
    for (var i = 3; i <= Math.ceil( Math.sqrt(n)) + 1; i+=2) {
        if (n % i == 0) {
            return false;
        }
    }

    return true;       
};

var primeFactors = function (n) {
    factorsArray = [];
    for (var i = 0; i < n; i++) {
        if (isPrime(i) && (n % i == 0)) {
            factorsArray.push(i);
            n /= i;
            i--; //nullify the effect of next for iteration (becuz a composite can 
                 //have one prime factor multiple times; e.g. 24 = 2 x 2 x 2 x 3
        }
    }
    return factorsArray
}

答案 1 :(得分:0)

我至少看到四个问题:

1)你需要在使用var之前使用i,因为它们是隐式全局变量并相互踩踏。因此,一个for循环会混淆另一个for循环。

2)您还需要更改:

if (i % n === 0)

if (n % i === 0)

3)您需要让isPrime()运行所有迭代,并且只有在所有迭代都成功后才返回true。

4)您不应该将01作为因素进行测试。

您可以在此处看到此修复版本:http://jsfiddle.net/jfriend00/8wgvypb6/

var isPrime = function(n) {
    for (var i=2;i<n;i++) {
        if (n % i === 0) {
            return false;
        }
    }
    return true;
};

var primeFactors = function(n) {
    var factorsArray = [];
    for (var i=2; i<n; i++) {
        if (isPrime(i)) {
            if (n % i === 0) {
                factorsArray.push(i);
            }
        }
    }
    return factorsArray;
}

有很多方法可以做到这一点,效率更高,但我只是纠正了你的特定方法中的错误,使其发挥作用。

答案 2 :(得分:0)

你的isPrime函数只会进行一次循环迭代,因为你的if和else语句都有一个return语句。您还可以通过构建一个已知素数的常数数组并在循环之前首先检查它来加速您的素数检查器退出。