我已经为这个问题写了多次尝试,但我认为这是我能得到的最接近的结果。这个解决方案使方法无限递归,因为我没有基本情况,并且我不能弄清楚它。counter++线路是无法到达的,我不能让它工作,我很累。使用循环会很容易,但递归对我来说是一种新概念,如果有人帮我解决这个问题,我会很感激。
public static double pi(int a, double b){
int counter=0;
if (counter %2==0){
return a-(a/(pi(a,b+2)));
counter++;
} else {
return a+(a/(pi(a,b+2)));
counter++;
}发布于 2014-10-31 08:45:16
您可以传入另一个int,比如limit,并添加以下代码:
if (b > limit) {
return a;
}或者您可以传入一些公差值:
if (pi(a,b+2) < tolerance) {
return a;
}当你使用递归的时候,最好提前建立一个退出策略。
发布于 2014-10-31 09:40:26
这是一个有效的实现。不要使用它:
public static double term(double acc, int n, int r) {
if (r-- > 0) {
double sgn = (n % 4 == 1) ? +1.0 : -1.0;
acc += sgn * 4.0 / n;
n += 2;
return term(acc, n, r);
} else {
return acc;
}
}
public static double pi() {
return term(0.0, 1, 1000);
}不使用它的原因是,这个特殊的无穷级数是计算π的一种特别糟糕的方法,因为它收敛非常慢。在上面的例子中,在执行了1000次迭代后,由于最终计算出的项是4/ 1000,所以仍然只有3位小数位是正确的。
超过1000次迭代会导致堆栈溢出错误,精度几乎没有提高,即使(我认为) term函数可能是尾递归的。
https://stackoverflow.com/questions/26665782
复制相似问题