首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从无穷级数中求出pi的值(pi=4-4/3+4/5-4/7+4/9-4/11…。)在java中使用递归

从无穷级数中求出pi的值(pi=4-4/3+4/5-4/7+4/9-4/11…。)在java中使用递归
EN

Stack Overflow用户
提问于 2014-10-31 08:39:30
回答 2查看 1.3K关注 0票数 0

我已经为这个问题写了多次尝试,但我认为这是我能得到的最接近的结果。这个解决方案使方法无限递归,因为我没有基本情况,并且我不能弄清楚它。counter++线路是无法到达的,我不能让它工作,我很累。使用循环会很容易,但递归对我来说是一种新概念,如果有人帮我解决这个问题,我会很感激。

代码语言:javascript
复制
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++;
}
EN

回答 2

Stack Overflow用户

发布于 2014-10-31 08:45:16

您可以传入另一个int,比如limit,并添加以下代码:

代码语言:javascript
复制
if (b > limit) {
    return a;
}

或者您可以传入一些公差值:

代码语言:javascript
复制
if (pi(a,b+2) < tolerance) {
    return a;
}

当你使用递归的时候,最好提前建立一个退出策略。

票数 0
EN

Stack Overflow用户

发布于 2014-10-31 09:40:26

这是一个有效的实现。不要使用它:

代码语言:javascript
复制
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函数可能是尾递归的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26665782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档