Java 中 Wallis 函数的递归实现
Recursive implementation of the Wallis function in Java
这是沃利斯函数:
我正在努力递归地实现它。这是我最好的尝试:
private static double computePiOver2(int n) {
int original_n = n;
double prod = 1.0;
int reps = 0;
if(reps == original_n)
return prod;
else {
reps += 1;
n += 1;
prod *= computePiOver2(2*n/(2*n-1)*(2*n/(2*n+1)));
return prod;
}
我正在使用此代码对其进行测试
public static void main(String[] args) {
for(int i = 0; i < 100; i++){
System.out.println(Math.PI/2 + " vs. " + computePiOver2(i));
}
}
但我的答案始终是 1.0。我做错了什么?
我尝试将 n
设为双倍:
private static double computePiOver2(double n) {
int original_n = (int) n;
double prod = 1.0;
int reps = 0;
if(reps == original_n)
return prod;
else {
reps += 1;
n += 1;
prod *= computePiOver2(2*n/(2*n-1)*(2*n/(2*n+1)));
return prod;
}
}
但我刚收到 Whosebug 错误。
我有两个错误,整数除法(感谢@azurefrog) and incorrect recursion technique (thanks @David M)。我应该像这样计算递归调用
(2n/(2n-1))*(2n/(2n+1)) * computePiOver2(n-1)
这是工作函数:
private static double computePiOver2(int n) {
double prod = 1.0;
int reps = 0;
if(reps == n)
return prod;
else {
reps += 1;
return 2.0*n/(2*n-1)*(2.0*n/(2*n+1)) * computePiOver2(n-1);
}
}
这是沃利斯函数:
我正在努力递归地实现它。这是我最好的尝试:
private static double computePiOver2(int n) {
int original_n = n;
double prod = 1.0;
int reps = 0;
if(reps == original_n)
return prod;
else {
reps += 1;
n += 1;
prod *= computePiOver2(2*n/(2*n-1)*(2*n/(2*n+1)));
return prod;
}
我正在使用此代码对其进行测试
public static void main(String[] args) {
for(int i = 0; i < 100; i++){
System.out.println(Math.PI/2 + " vs. " + computePiOver2(i));
}
}
但我的答案始终是 1.0。我做错了什么?
我尝试将 n
设为双倍:
private static double computePiOver2(double n) {
int original_n = (int) n;
double prod = 1.0;
int reps = 0;
if(reps == original_n)
return prod;
else {
reps += 1;
n += 1;
prod *= computePiOver2(2*n/(2*n-1)*(2*n/(2*n+1)));
return prod;
}
}
但我刚收到 Whosebug 错误。
我有两个错误,整数除法(感谢@azurefrog) and incorrect recursion technique (thanks @David M)。我应该像这样计算递归调用
(2n/(2n-1))*(2n/(2n+1)) * computePiOver2(n-1)
这是工作函数:
private static double computePiOver2(int n) {
double prod = 1.0;
int reps = 0;
if(reps == n)
return prod;
else {
reps += 1;
return 2.0*n/(2*n-1)*(2.0*n/(2*n+1)) * computePiOver2(n-1);
}
}