使用C中的递归计算pi的值

时间:2017-03-25 02:00:36

标签: 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 - 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。有人在乎解释原因吗?

2 个答案:

答案 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