素数因子计算器JS - 找不到无限循环

时间:2015-08-30 00:14:12

标签: javascript math

所以我试图重新解决我的问题解决能力,并想重做我的素数因子计算器。代码重构,效率更高等等,因为当我做它时,我是JS的初学者。

在重新创建它时,我遇到了一个相当大的问题 - 无限循环。现在,我已经将我的功能分解为不同的部分并分别调用它们 - 它们工作正常。主要功能本身甚至可以正常工作,只要数量为10或更少。但由于某种原因,每当我调用参数大于10的函数时,就会出现无限循环。

如果答案很明显,我很抱歉,现在已经很晚了。我似乎无法发现它。

普通代码在这里:

var findPrimeFactors = function (number) {

    var isPrime = function (number) {
        var primes = [];
        for (i = 2; i < number; i++) {
            if (number % i === 0) {
                return false;
            }
        }
        primes.push(number);
        return primes;
    };

    var findFactors = function (number) {
        var factors = [];
        for (i = 2; i < number; i++) {
            if (number % i === 0) {
                factors.push(i);
            }
        }
        return factors;
    };

    var factors = findFactors(number);
    var primes = [];
    for (i = 0; i < factors.length; i++) {
        primes += isPrime(factors[i]);
    }
    return primes;
};

console.log(findPrimeFactors(10));

代码的小提琴在这里:https://jsfiddle.net/uk26q4ff/

谢谢大家!

2 个答案:

答案 0 :(得分:2)

可能你正在点击这个,因为在每个函数中你都没有声明i所以它在全局范围内使用它。

答案 1 :(得分:1)

我发现了一些错误。

  1. 您的isPrime函数应该返回true或false,而不是数组
  2. findFactors中的循环应该包含&#39;数字&#39;值(已更改&lt;到&lt; =)
  3. 通过在每个中使用相同的变量i来导致无限循环 环。
  4. 最后我更改了以下内容,我更改了以下内容 最后:if(isPrime(factors [k]))primes.push(factors [k]);
  5. 我将如何做到这一点:

    var findPrimeFactors = function (number) {
    
        var isPrime = function (number) {
            var primes = [];
            for (i = 2; i < number; i++) {
                if (number % i === 0) {
                    return false;
                }
            }
            //primes.push(number);
            //return primes;
            return true;
        };
    
        var findFactors = function (number) {
            var factors = [];
            for (j = 2; j <= number; j++) {
                if (number % j === 0) {
                    factors.push(j);
                }
            }
            return factors;
        };
    
        var factors = findFactors(number);
        var primes = [];
        for (k = 0; k < factors.length; k++) {
            //primes += isPrime(factors[k]);
            if (isPrime(factors[k])) primes.push(factors[k]);
        }
        return primes;
    };
    
    console.log(findPrimeFactors(37));