我写了一个计算圆周率的程序,但是出了点问题

时间:2019-09-17 13:49:08

标签: java algorithm pi

所以我想做些不同的事情,所以我尝试创建一个计算Pi的程序。我对编程还是很陌生,所以请原谅我对程序的a惜。

import java.math.BigDecimal;
import java.math.RoundingMode;


public class pi {
public static   BigDecimal pie = new BigDecimal(4);
public static void pi(int count, int a, int stop){
        BigDecimal count1 = new BigDecimal(count);
        BigDecimal a1 = new BigDecimal(a);

        pie= pie.add(new BigDecimal(4).divide(a1.multiply(count1), 20, BigDecimal.ROUND_HALF_UP));
        System.out.println(pie);
        if (stop<1000000)
        pi(count*-1, a+2, stop+1);

        }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
pi(-1,3,0);
    }

}

结果:

2.66666666666666666667

3.46666666666666666667

2.89523809523809523810

3.33968253968253968254

...

...

3.14137796917835535721

3.14180729192172768736

3.14137806131758561203

3.14180719982203792401

然后我得到了堆栈溢出异常。

我的问题是我的程序有什么问题,因为我检查了第一个递归中的4个给出了正确的结果,但是随着更多的递归发生,该程序仍然无法达到pi。

编辑:感谢您的所有评论和答复。现在,我知道的更多了,我将使用更好的系列并迭代地编写程序。我以前曾经读过递归的缺点,但直到现在我还没有亲眼目睹。

我现在遇到的另一个问题是递归在循环数上是否有限制?因为在这种情况下,显然可以。

1 个答案:

答案 0 :(得分:2)

我建议删除递归。它导致您进入StackOverflowError。 以及一些重构:

import java.math.BigDecimal;
import static java.math.RoundingMode.HALF_UP;

public class pi {
    public static BigDecimal pie = new BigDecimal(2);

    public static void pi(int count) {
        BigDecimal count1 = new BigDecimal(count);
        BigDecimal a1 = new BigDecimal(count-1);
        BigDecimal a2 = new BigDecimal(count+1);

        pie = pie.multiply(count1.pow(2).divide(a1, 20, HALF_UP).divide(a2, 20, HALF_UP));
        System.out.println(pie);
    }

    public static void main(String[] args) {
        for (int i = 2; i < 1000000; i=i+2) {
            pi(i);
        }
    }
}

PS:我是Wallis的π产品。 它工作了10分钟,价值是 3.1415297443583857077035169813896585428463586724137842214143641304426802276061154436561964553155700401625655010