我必须用这个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
非常感谢您的帮助
答案 0 :(得分:3)
你有三个问题(一个可能是轻微的,非致命的):
递归的不必要的二次复杂度
你以平方的方式重新计算递归,这是非常昂贵的。当你只需要做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”)。