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;
}