0

试图想出一个函数来检查一个数字是否是素数,我遇到了麻烦。我确信有一种更简单的方法可以做到这一点,但为什么这个函数不会为数字 9 返回 false?它为偶数返回 false,但对于任何其他类型的合数,它返回未定义,但由于它打印 NOT PRIME,它也应该返回 false。

function isPrime(n, i) {
    document.writeln(i);
    var nextNum = i + 1;
    var number = n;
    if (i < n) {
        if ((n % i) === 0) {
            document.writeln("NOT PRIME");
            return false;
        } else {
            document.writeln(nextNum);
            isPrime(number, nextNum);
        }
    } else if (i === n) {
        document.writeln("Recursion ends");
        return true;
    } else {
        document.writeln("Confused" + typeof i + typeof n);
    }
}
4

3 回答 3

7

您需要返回递归调用的值,即更改

isPrime(number, nextNum);

return isPrime(number, nextNum);
于 2013-11-06T18:33:52.917 回答
1

递归调用 isPrime 后,您在此分支中缺少返回:

    if ((n % i) === 0) {
        document.writeln("NOT PRIME");
        return false;
    } else {
        document.writeln(nextNum);
        isPrime(number, nextNum);
    }

我认为您想将其更改为:

    if ((n % i) === 0) {
        document.writeln("NOT PRIME");
        return false;
    } else {
        document.writeln(nextNum);
        return isPrime(number, nextNum);
    }

因为您没有在该分支中返回任何内容,所以 true/false 调用正在消失。

于 2013-11-06T18:35:03.350 回答
1

它应该只需要一个参数来检查是否为素数。

试试这个:

function isPrime(num){

    // An integer is prime if it is not divisible by any prime less than or equal to its square root
    var squareRoot = parseInt(Math.sqrt(num));
    var primeCountUp = function(divisor){
        if(divisor > squareRoot) {
            // got to a point where the divisor is greater than 
            // the square root, therefore it is prime
            return true;
        }
        else if(num % divisor === 0) {
            // found a result that divides evenly, NOT prime
            return false;
        }
        else {
            // keep counting
            return primeCountUp(++divisor);
        }
    };

    // start @ 2 because everything is divisible by 1
    return primeCountUp(2);

}

从这里添加“平方根”的高

于 2013-11-06T18:36:41.760 回答