Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言递归计算pi值_C_Recursion - Fatal编程技术网

用C语言递归计算pi值

用C语言递归计算pi值,c,recursion,C,Recursion,所以我试着用递归计算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 -

所以我试着用递归计算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;
}
#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;
}
#包括
#包括
#包括
#包括
双π(整数n){
双s=0;
s=s+4*(功率(-1,n+1)*(1/(2*n-1));
如果(n>0){
pi(n-1);
}
返回s;
}
内部主(空){
int n,i;
浮动*A;
scanf(“%d”和“&n”);
A=(浮动*)malloc(n*sizeof(浮动));
对于(i=0;i

对于
n=1
的值,它返回预期的答案
pi=4
,但对于任何其他值,它计算出
pi=0
。有人愿意解释原因吗?

使用
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的原因。

你可以这样做:

#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;
}
#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(n-1)
s+=pi(n-1)s
n
A
这样的简短而神秘的名称只会妨碍代码的可维护性。您应该解释原因,而不仅仅是编写代码。