C 需要对递归函数进行优化

C 需要对递归函数进行优化,c,optimization,recursion,C,Optimization,Recursion,我想优化此函数,使其能够快速输出输入值 (x=300,y=120,z=10)。 我曾想过在连续计算后将值存储在3D数组中,但无法实现 请帮忙。递归太难理解了 double P(int x, int y, int z) { double final; if (x >= 0 && (y <= 0 || z <= 0)) return 0; else if (x <= 0 && (y >= 0

我想优化此函数,使其能够快速输出输入值
(x=300,y=120,z=10)。
我曾想过在连续计算后将值存储在3D数组中,但无法实现

请帮忙。递归太难理解了

double P(int x, int y, int z) {

    double final;
    if (x >= 0 && (y <= 0 || z <= 0))
        return  0;

    else if (x <= 0 && (y >= 0 || z >= 0) )
        return 1;

    else {     
        final = 0.1 * (P(x,y-1,z)
                       + P(x-1,y-1,z)
                       +  P(x-2,y-1,z)
                       +  P(x-3,y-1,z)
                       +  P(x-4,y-1,z)
                       +  P(x-5,y-1,z)
                       +  P(x-6,y-1,z)
                       +  P(x-1,y,z)
                       +  P(x-1,y,z)
                       +  P(x,y-1,z-1));
        return final;
    }
}
double P(整数x,整数y,整数z){
双决赛;
如果(x>=0&&(y),则需要构建函数的版本,即包括缓存:

double P_memoized (int x, int y, int z, double ***cache) {

    if (x >= 0 && (y <= 0 || z <= 0))
        return  0;

    else if (x <= 0 && (y >= 0 || z >= 0) )
        return 1;

    else {
        if (cache[x][y][z] < 0.0) /* Negative => uncached.  */
          cache[x][y][z] = 0.1 * (P_memoized(x,y-1,z, cache)
                                  +  P_memoized(x-1,y-1,z, cache)
                                  +  P_memoized(x-2,y-1,z, cache)
                                  +  P_memoized(x-3,y-1,z, cache)
                                  +  P_memoized(x-4,y-1,z, cache)
                                  +  P_memoized(x-5,y-1,z, cache)
                                  +  P_memoized(x-6,y-1,z, cache)
                                  +  P_memoized(x-1,y,z, cache)
                                  +  P_memoized(x-1,y,z, cache)
                                  +  P_memoized(x,y-1,z-1, cache));
        return cache[x][y][z];
    }
}
然后你可以像以前一样使用它,只是这次,它要快得多:

#include <stdio.h>
int main (void)
{
  printf ("%f\n", P (10, 5, 3));
  return 0;
}
#包括
内部主(空)
{
printf(“%f\n”,P(10,5,3));
返回0;
}
花式缓存

如果您想对<代码> P<代码>进行多次调用,那么每次创建和删除<代码> Cache < /C> >可能不是最好的主意。那么您应该考虑以下事项:

  • 使缓存在调用
    P
  • 在需要时动态调整缓存大小
  • 不要
    释放
    P
    末尾的缓存(因为它将被重用)
  • 为什么需要动态调整缓存大小?因为第一次调用
    p
    时使用
    x==10
    。然后该函数将创建一个宽度为10的缓存。下一次,如果使用
    x==20
    调用
    p
    ,则旧缓存的宽度不够大。但其中包含的旧值仍然有用

    谈论使用2D数组的
    realloc
    ing。您应该能够将其扩展到3D版本


    一旦你这样做了,你可能想考虑一个新的问题:缓存永远不会得到
    空闲
    d。因此它会一直保留分配的内存,直到程序退出。然后你可能想拥有一个全局缓存,而不是一个局部静态缓存,并提供一个单独的函数来
    最终释放它。

    就像这样不是一个问题“为我编写代码”网站,我们不是一个“为我优化代码”网站。你去研究一下怎么样?不,递归没那么难,你只需要先了解递归就可以了。:o)如果我们不知道您想做什么,则很难优化此问题!请详细解释此问题,然后提供您的尝试。并且一定要将
    P(x-1,y,z)+P(x-1,y,z)
    替换为
    2*P(x-1,y,z)
    @TEOUltimus谢谢你指出这一点!!先生,这是很棒的代码!!!但我还是个业余爱好者,所以大部分代码对我来说都很花哨!!!你能给我一些指导或给我一些重要的维基百科主题,让我可以了解更多!!@snehash-你不需要在so:P上称呼任何人为“先生”。现在:哪一部分看起来花哨?哪一行你不明白代码的种类吗?我不介意编辑答案并解释一下。删除缓存有什么用???如果我输入了几个测试用例,删除缓存有用吗???删除缓存-缓存是动态分配的,所以它需要是
    免费的
    d(删除)。但是,这实际上取决于您在何处执行操作。如果您多次调用
    P
    ,则每次在
    P
    中创建和删除
    缓存可能不太好。然后,您可能希望使缓存
    静态
    ,以便它能够跨调用
    P
    。但是,您必须将代码包含到dyn中在需要时友好地增长P。谈到缓存,我可能会一次性分配
    缓存
    (即用一个大数组模拟多维数组)。
    *alloc
    函数族通常调用速度相当慢(尽管比根本不缓存计算快)而且它将大大简化内存管理(尽管会给数组订阅带来一些额外的复杂性——这个示例根本不包含任何错误检测)。
    #include <stdio.h>
    int main (void)
    {
      printf ("%f\n", P (10, 5, 3));
      return 0;
    }