递归函数的代码优化

时间:2015-11-24 10:41:36

标签: c recursion optimization

我在C中有一个递归函数,如下所示:

float U(int k, int h)
{
    h --;
    int r, s;
    float sum1 = 0, sum2 = 0;

    if (h == -1)
    {
        return (float) ((pow(-1, k)) / factorial(k));
    }

    else
    {
        for (r = 0; r <= k; r++)
        {
            for (s = 0; s <= h; s++)
            {
                sum1 += (r + 1) * (k - r + 1) * U(r + 1, h - s) * U(k - r + 1, s);
            }
        }
        for (r = 0; r <= k; r++)
        {
            for (s = 0; s <= h; s++)
            {
                sum2 += (k - r + 1) * (k - r + 2) * U(r, h - s) * U(k - r + 2, s);
            }
        }
        return (float) ((sum1 + sum2) / (h + 1));
    }
}

我希望优化代码,因为函数需要花费大量时间来计算即使不是那么大的值,例如U(10,13)。请提供一些建议以及代码段(如果可能的话)。

1 个答案:

答案 0 :(得分:1)

您可以记住名为arr的数组中的值。使用更好的缩进,因为您的代码应该易于理解。在运行递归之前,使用arr对数组-1进行memset。代码应如下所示 -

float arr[100][100];

float U(int k,int h)
{    
    h=h-1;
    int r,s;
    //float sum=0,sum1=0,sum2=0;

    if(h==-1)
    {
        float O_O = (float)(k%2!=0 ? -1:1);
        for(int _w=1; _w<=k; _w++)
            O_O/=(float)_w;
        return O_O;
    }

    if(arr[k][h]<-0.5)return arr[k][h];
    arr[k][h]=0;

    for(r=0;r<=k;r++)
    {
        for(s=0;s<=h;s++)
        {
            arr[k][h]+=(r+1)*(k-r+1)*U(r+1,h-s)*U(k-r+1,s);         
        }       
    }

    for(r=0;r<=k;r++)
    {
        for(s=0;s<=h;s++)
        {
            arr[k][h]+=(k-r+1)*(k-r+2)*U(r,h-s)*U(k-r+2,s);
        }
    }

    return (float)(arr[k][h]/(h+1));
}