所以我试图用递归来计算pi的值。我的代码如下所示:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <malloc.h>
double pi (int n){
double s = 0;
s = s + 4 * ( pow(-1,n+1 ) * (1/(2*n-1) ) );
if( n > 0 ) {
pi( n - 1 );
}
return s;
}
int main(void) {
int n,i;
float *A;
scanf("%d", &n);
A = (float*)malloc( n *sizeof(float) );
for( i = 0 ; i < n; i++ ) {
A[i] = pi( i + 1 );
}
for( i = 0; i < n; i++ ) {
printf( "%f\n", A[i] );
}
return 0;
}
对于n = 1
的值,它会返回预期答案pi = 4
,但对于任何其他值,它会计算pi = 0
。有人在乎解释原因吗?
答案 0 :(得分:1)
使用s = s + 4 * ( pow(-1,n+1 ) * (1.0/(2*n-1) ) );
而不是s = s + 4 * ( pow(-1,n+1 ) * (1/(2*n-1) ) );
因为如果n = 2 ,(1 /(2 * n-1))部分将给出 1/3 ,并且为 1和3都是整数,结果将转换为 0 的整数,这就是为什么你得到0。
答案 1 :(得分:0)
你可以这样做:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <malloc.h>
double pi (int n){
double s = 0;
if( n > 0 ) {
s = s + 4 * ( pow(-1,n+1 ) * (1/(2*(double)n-1) ) );
s += pi( n - 1 );
}
return s;
}
int main(void) {
int n,i;
float *A;
scanf("%d", &n);
A = (float*)malloc( n *sizeof(float) );
for( i = 0 ; i < n; i++ ) {
A[i] = pi( i + 1 );
}
for( i = 0; i < n; i++ ) {
printf( "%f\n", A[i] );
}
return 0;
}
这些是你做错的事情:
在函数 pi 中,您只返回第一次递归调用中 s 的值。连续递归调用的 s 值将丢失。
...
在这段代码 1 /(2 * n-1)中,由于n是整数,因此发生整数除法。您需要将n转换为double,以避免在浮点后丢失数字
...
这段代码
s = s + 4 * ( pow(-1,n+1 ) * (1/(2*n-1) ) );
应放在if条件if( n > 0 )
内 这是因为,当n等于0时,您只需将另外4加到 s 的值。
s = s + 4 * ( pow(-1, 0+1 ) * (1/(2*0-1) ) );
s = s + 4 * ( -1 * -1)
s = s + 4