user2961738
user2961738

Reputation: 1

Function supposed to return a boolean returns undefined

Trying to come up with a function to check if a number is prime and I'm running into trouble. I'm sure there's a simpler way to do this, but why would this function not return false, for the number 9? It returns false for even numbers but for any other type of composite number it returns undefined, but since it prints NOT PRIME it should also be returning 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);
    }
}

Upvotes: 0

Views: 1651

Answers (3)

Naftali
Naftali

Reputation: 146302

It should just need one parameter to check if prime.

Try this out:

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

}

Adding the high of the "square root" from here

Upvotes: 1

Schleis
Schleis

Reputation: 43690

You are missing a return in this branch after the recursive call to isPrime:

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

I think that you want to change it to:

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

Because you aren't returning anything in that branch, the true/false calls are disappearing.

Upvotes: 1

fred02138
fred02138

Reputation: 3361

You need to return the value of the recursive call, i.e., change

isPrime(number, nextNum);

to

return isPrime(number, nextNum);

Upvotes: 7

Related Questions