我在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)
。请提供一些建议以及代码段(如果可能的话)。
答案 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));
}