Java:通过递归计算Pi(如果只是其他)

时间:2015-11-16 00:24:28

标签: java recursion pi

我必须用这个Formula计算数字Pi。 注意:java中的初学者。 我的想法到现在为止:

public static void main(String[] args) {
    System.out.println(Math.sqrt(quadraticFractionSum(20) * 6.0));
}
static double quadraticFractionSum(double counter) {
    if (counter == 1000.0) {
        return counter;
    } else {
        return counter + 1 / (quadraticFractionSum(counter + 1) * quadraticFractionSum(counter + 1));
    }
}

问题是需要永远计算:/ - 解决:答案:Alain O'Dea + Balwinder Singh

新问题: 代码不是计算pi - 解决了答案:Aimert

非常感谢您的帮助

2 个答案:

答案 0 :(得分:3)

你有三个问题(一个可能是轻微的,非致命的):

  1. 性能严重:递归的不必要的二次复杂度
  2. 严重的正确性:你从错误的计数开始,递归的情况是错误的
  3. 轻微但有启发性:不必要地使用浮点和可能的舍入错误
  4. 递归的不必要的二次复杂度

    你以平方的方式重新计算递归,这是非常昂贵的。当你只需要做980时,你正在进行2 ^ 980个递归调用(注意我在谈论单个方法调用而不是堆栈深度)。这是一个糟糕的成本爆炸。

    从错误的计数开始,递归情况错误

    其次,你需要在 1 开始计数,而不是 20 ,你需要做 1 / counter ^ 2 +递归情况下的quadSum(count + 1)。我在那里使用 1.0d / counter ^ 2 来确保Java使用 double 算术。否则,它将使用积分算法,并仅提供 1 0 作为结果。

    对于最后一次迭代,基本情况(停止近似1000次迭代)应返回 1.0d / counter ^ 2 。我选择将基本案例迭代+ 1 并返回 0.0d ,因为我认为它更清晰。

    不必要地使用浮点和可能的舍入错误

    最后,由于累积的浮点错误,您的基本情况可能无法正常工作。

    对于 double 或任何浮点数,

    == 是一个冒险的主张。精度误差会随着每次计算而累积,很容易导致它不等于基本情况的整数。

    计数器应为 int 。试试看,看看它是否加速。

    建议的解决方案

    以下代码演示了我为您提出的修复建议:

    public static void main(String[] args) {
        System.out.println(Math.sqrt(quadraticFractionSum(1) * 6.0));
    }
    static double quadraticFractionSum(int counter) {
        if (counter == 1001) {
            return 0.0d;
        } else {
            return 1.0d / (counter * counter) + quadraticFractionSum(counter + 1);
        }
    }
    

答案 1 :(得分:1)

public static void main(String[] args) {
    System.out.println(Math.sqrt(quadraticFractionSum(1) * 6));
}

static double quadraticFractionSum(int counter) {
    if (counter == 1000) {
        return 1d / (counter * counter);
    } else {
        double quadraticFractionSum = quadraticFractionSum(counter + 1);
        return quadraticFractionSum + 1d / (counter * counter);
    }
}

当你做1 /无论什么时,它会给你一个整数结果,因为这两个数字都是整数。你必须指定你想要一个双重结果,否则你得到零(因此“1d”)。