如何在递归C程序中修复意外输出?

时间:2016-05-26 03:00:05

标签: c math recursion

我正在尝试编写一个简单的递归函数来评估C中的Associated Legendre多项式。到目前为止,我只写了L = 4和M = 3。我正在使用以下维基百科文章中的第七个递推公式:

https://en.wikipedia.org/wiki/Associated_Legendre_polynomials

这是我的代码:

#include <stdio.h>
#include <math.h>

long double Legendre(int L, int M, double x){

    if((M == 0) && (L == 0)){
        return 1;
    }

    if((M == 0) && (L == 1)){
        return x;
    }

    if((M == 0) && (L == 2)){
        return (1/2) * ((3*x*x) - 1);
    }

    if((M == 0) && (L == 3)){
        return (1/2) * ((5*pow(x,3)) - (3*x));
        }

   if((M == 0) && (L == 4)){
            return (1/8) * (3 - (30*x*x) + (35*pow(x,4)));
        }

else if(M > 0){

        return (((L - M + 1)*x*Legendre(L,M-1,x))
                - ((L + M - 1)*Legendre(L-1,M-1,x)))
                / sqrt(1-(x*x));

    }

    return 0;
}

int main(void){

    int L = 4;
    int M = 2;
    double x = 0.6;

    printf("%Lf\n",Legendre(L,M,x));
}

根据Mathematica,L = 4,M = 2和x = 0.6的相关勒让德多项式应为7.3。但是,当我运行上面的程序时,我得到以下结果:

$ gcc Rodrigues.c -o Rodrigues
$ ./Rodrigues
0.000000
$ 

(我的源文件名是Rodrigues.c)。输出应该是7.3左右,而不是0.该代码还为不同的Ls生成其他非零(但仍然不正确)值。我怀疑这是因为我有点搞砸了递归(你可以告诉我,我我对编程比较陌生。我错过了什么?感谢。

0 个答案:

没有答案