所以我想做些不同的事情,所以我尝试创建一个计算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。
编辑:感谢您的所有评论和答复。现在,我知道的更多了,我将使用更好的系列并迭代地编写程序。我以前曾经读过递归的缺点,但直到现在我还没有亲眼目睹。
我现在遇到的另一个问题是递归在循环数上是否有限制?因为在这种情况下,显然可以。
答案 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