用于素数递归的Java-StackOverflowerr

用于素数递归的Java-StackOverflowerr,java,recursion,stack-overflow,Java,Recursion,Stack Overflow,为什么这个代码会给我一个StackOverflower错误?我试图使计数素数的运行速度快于O(n**2) 我的代码: public class TestingJavaCode { public int countPrimes(int n) { int counter = 0; n--; if (n > -1 && this.isPrime(n)) { counter++; }

为什么这个代码会给我一个StackOverflower错误?我试图使计数素数的运行速度快于
O(n**2)

我的代码:

public class TestingJavaCode {

    public int countPrimes(int n) {
        int counter = 0;
        n--;

        if (n > -1 && this.isPrime(n)) {
            counter++;
        }

        counter += countPrimes(n);

        return counter;
    }


    public boolean isPrime(int n) {
        for (int i = 2; i < n; i++) {
            if (n % i == 0)
                return false;
        }
        return true;
    }
公共类测试javacode{
公共整数素数(整数n){
int计数器=0;
n--;
如果(n>-1&&this.isPrime(n)){
计数器++;
}
计数器+=计数素数(n);
返回计数器;
}
公共布尔iPrime(int n){
for(int i=2;i
代码中有一个错误,导致递归无限

但即使不是这样,您也会为
countPrimes
创建
n
堆栈帧。如果
n
足够大,则会出现堆栈溢出

在这种情况下,您可以很容易地使用循环而不是递归。这也将运行得稍快一些


isPrime
中可能会有更有效的加速,实际上您只需要检查整数的平方根的除数。在检查2之后,您也不需要检查其他偶数除数。

您减少了n,但递归何时停止?此时递归调用总是被击中只是一个旁注:您可以跳过一个l迭代的几乎一半,因为除了2之外,每个偶数都不能是素数