应该返回布尔值的函数返回undefined

时间:2013-11-06 18:23:15

标签: javascript

试图找出一个函数来检查一个数字是否为素数并且我遇到了麻烦。我确定有一种更简单的方法可以做到这一点,但为什么这个函数不会返回false,对于数字9?它为偶数返回false,但对于任何其他类型的复合数,它返回undefined,但由于它打印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);
    }
}

3 个答案:

答案 0 :(得分:7)

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

isPrime(number, nextNum);

return isPrime(number, nextNum);

答案 1 :(得分: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);
    }

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

答案 2 :(得分: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);

}

here

添加“平方根”的高点