返回语句中的堆栈溢出错误

时间:2018-03-05 01:07:31

标签: java stack-overflow

当我提交到画布时出现堆栈溢出错误,但它在Visual Studio Code中运行正常,任何人都知道这是什么问题?

这是错误:

Exception in thread "main" java.lang.StackOverflowError
    at Phi.gcd(Phi.java:14

这是作业:

  

Euler的totient函数,也称为φ(n),测量数量   正整数相对于n小于n的素数。二   如果gcd为1,则数字相对为素数。例如:φ(9)= 6   因为1,2,4,5,7和8是9的相对素数   有关Euler的函数的信息可以在这个Wiki上找到   页。

n Relatively Prime    φ(n)
2 1   1
3 1,2 2
4 1,3 2
5 1,2,3,4 4
6 1,5 2
7 1,2,3,4,5,6 6
8 1,3,5,7 4
9 1,2,4,5,7,8 6
10    1,3,7,9 4
     

编写一个以整数phi(int n)作为输入的函数int n   并返回φ(n)和一个main(),提示用户输入整数i,   调用函数φ(i),并打印结果。的上限   输入i是250000。

     

计算φ(n)的闭合公式为:其中p1,p2,...,pm   是将数字n除以的素数。

     

程序的输出应该像示例一样外观和功能   如下所示。

Enter a positive integer n: 8
Phi(n): 4

这是我的代码:

import java.util.Scanner;

public class Phi {

    static int gcd(int a, int b)
    {
        if (a == 0 || b == 0)
            return 0;

        if (a == b)
            return a;

        if (a > b)
            return gcd(a-b, b);
        return gcd(a, b-a);
    }

    static int phi(int n) {
        int count=0;
        for(int i = 1; i < n; ++i) {
            if(gcd(n, i) == 1) {
                count++;
            }
        }
        return count;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter a positive integer n: ");;
        int n = in.nextInt();
        System.out.printf("Phi(%d): %d\n", n, phi(n));
    }

}

1 个答案:

答案 0 :(得分:9)

这是因为您的递归GCD方法非常缓慢地收敛到GCD的值。例如,如果传递250000和1,则您的方法将使用250000个堆栈帧,比大多数JVM为您分配的帧数多。

一种解决方案是使用迭代重写Euclid的GCD算法。另一种解决方案是使用更快的算法:

int gcd(int a, int b) {
    return (b != 0) ? gcd(b, a % b) : a;
}