Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Stack overflow error in Java recursion

I'm trying to implement a code that returns the sum of all prime numbers under 2 million. I have an isPrime(int x) method that returns true if the the number is prime. Here it is:

public static boolean isPrime(int x) {

        for (int i = 2; i < x; i++) {

            if (x % i == 0) {
                return false;
            }

        }
        return true;

    }

And the other method, which I'm trying to implement recursively, only works until a certain number, over that number and I get a stack overflow error. The highest I got the code to work was for 10,000.

Here it is:

public static int sumOfPrimes(int a) {

    if (a < 2000000) {  //this is the limit

        if (isPrime(a)) {
            return a + sumOfPrimes(a + 1);

        } else {
            return sumOfPrimes(a + 1);
        }

    }
    return -1;
}

So why do I get a stack overflow error when the number gets bigger and how can I deal with this? Also, how do you normally deal with writing code for such big numbers? IE: normal number operations like this but for larger numbers? I wrote this recursively because I thought it would be more efficient but it still wont work.

like image 991
ninesalt Avatar asked Aug 19 '15 14:08

ninesalt


People also ask

What is stack overflow error in recursion?

The most-common cause of stack overflow is excessively deep or infinite recursion, in which a function calls itself so many times that the space needed to store the variables and information associated with each call is more than can fit on the stack. An example of infinite recursion in C. int foo() { return foo(); }

Which recursion can avoid stack overflow error?

In order to prevent stack overflow bugs, you must have a base case where the function stops make new recursive calls. If there is no base case then the function calls will never stop and eventually a stack overflow will occur. Here is an example of a recursive function with a base case.


1 Answers

Your isPrime function is inefficient, it doesn't have to go to x, it's enough to go to the square root of x.

But that is not the reason why your solution doesn't work. You cannot have a recursion depth of 1 million.

I would solve this problem iteratively, using the sieve of eratosthenes and for loop over the resulting boolean array.

like image 105
Tawcharowsky Avatar answered Sep 30 '22 01:09

Tawcharowsky