递归是一种代码简洁实现简单的但效率不太高的处理重复计算的方法。效率不高是因为耗内存,耗内存是回溯时的重复计算,每次函数调用时参数的进栈出栈。所以,提高递归效率的方法就是减少重复计算。最简单的就是保存之前计算的结果。
举例说明,这是个常见的面试题:
对于一个递归函数w(a,b,c) 如果a< =0 or b< =0 or c< =0就返回值1. 如果a> 20 or b> 20 or c> 20就返回w(20,20,20) 如果a< b并且b< c 就返回w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c) 其它别的情况就返回w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1)。
实现也很简单,但如果直接递归,要花费时间很长。当加上数组保存后,效率一下就提高了。
int f[A][B][C];
int w(int a, int b, int c)
{
if(a <= 0 || b <= 0 || c <= 0) return 1;
if(a > 20 || b > 20 || c > 20) return w(20, 20, 20);
if(f[a][b][c] != -1) return f[a][b][c];
if(a<b && b<c)
{
f[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c);
return f[a][b][c];
}
else
{
f[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1);
return f[a][b][c];
}
}另一个例子说明:http://blog.jobbole.com/60798/
欢迎大家讨论更好的方法。
递归虽然简洁,但效率较低,主要源于内存消耗和重复计算。通过保存之前的结果可以显著提高效率。以一个面试题为例,展示了递归函数w(a,b,c)的优化过程,利用数组存储中间结果,显著提升了运行速度。链接中的博客提供了更多细节和示例。"
132440722,19673165,Java编程:创建树形菜单,"['Java开发', 'Java GUI', 'Java Swing', '菜单设计', '数据结构']
3786

被折叠的 条评论
为什么被折叠?



