天天看點

遞歸和非遞歸實作規律函數

1、問題

A(n) = n / (2 * n + 1)

B1 = 2 + A1;

B2 = 2 + A1 * (2 + A2);

B3 = 2 + A1 * (2 + A2 * (2 + A3));

....以此類推,求B(n)

2、代碼實作

#include <stdio.h>
 
 
/** 
A(n) = n / (2 * n + 1)
B1 = 2 + A1;
B2 = 2 + A1 * (2 + A2);
B3 = 2 + A1 * (2 + A2 * (2 + A3));
....以此類推,求B()
**/
float A(float n) 
{
    if (n < 0)
        return 0;
    float result = n / (2 * n + 1);
    return result;
}
 
//非遞歸實作
float B(float n)
{
    if (n < 0)
        return 0;
    float sum = 1;
    for (int i = n; i >= 1; --i) 
    {
        sum = sum * A(i) + 2;
    }
    return sum;
}
 
//遞歸實作
float recursion_B(float n) 
{
    if (n < 0)
        return 0;
    static float sum = 1;
    if (n == 0)
        return sum;
    else 
    {
        sum = sum * A(n) + 2;
        recursion_B(n - 1); 
    }
}
 
int main()
{
    for (int i = 0; i < 20; i++)
        printf("B(%d) is %f\n", i, B(i));
    printf("recursion_B(10) is %f\n",  recursion_B(10));
}      

3、運作結果

B(0) is 1.000000
B(1) is 2.333333
B(2) is 2.800000
B(3) is 2.990476
B(4) is 3.073016
B(5) is 3.109957
B(6) is 3.126829
B(7) is 3.134643
B(8) is 3.138300
B(9) is 3.140024
B(10) is 3.140842
B(11) is 3.141232
B(12) is 3.141419
B(13) is 3.141509
B(14) is 3.141552
B(15) is 3.141573
B(16) is 3.141583
B(17) is 3.141588
B(18) is 3.141591
B(19) is 3.141592
recursion_B(10) is 3.140842      

繼續閱讀