递归计算PI

时间:2017-11-18 11:51:07

标签: java math recursion

Formula (Mathematic background)

我尝试使用以下方法计算PI :( Java-Code)

private static double calculate(double k) {
    return (
            ( 3 * Math.pow(2, k-1) ) *
                    Math.sqrt(
                            2 - (2 * Math.sqrt(
                                    1-(
                                            Math.pow((calculate(k-1) / ( 3*Math.pow(2, k-1) )), 2)
                                    )
                            ))
                    )
    );
}

我在线程" main"中得到一个例外我尝试以递归方式调用方法本身的行上的java.lang.StackOverflowError。

有任何想法或建议吗?

1 个答案:

答案 0 :(得分:1)

您可以使用尾递归(动态编程)而不是简单递归来计算它,如下所示:

private static double calculate(double k) {
    double result = 3 * Math.sqrt(2);
    for(int i = 2; i <= k; i++)
       result = 3*Math.pow(2, k-1)*Math.sqrt(2-(2*Math.sqrt(1-Math.pow(result / ( 3*Math.pow(2, k-1) ), 2)));
    return result;
}

在这种方法中,您无需担心stackoverflow。此外,您在实现和运行时具有良好的性能,例如您想要的递归实现。