递归高效处理

递归虽然简洁,但效率较低,主要源于内存消耗和重复计算。通过保存之前的结果可以显著提高效率。以一个面试题为例,展示了递归函数w(a,b,c)的优化过程,利用数组存储中间结果,显著提升了运行速度。链接中的博客提供了更多细节和示例。" 132440722,19673165,Java编程:创建树形菜单,"['Java开发', 'Java GUI', 'Java Swing', '菜单设计', '数据结构']

递归是一种代码简洁实现简单的但效率不太高的处理重复计算的方法。效率不高是因为耗内存,耗内存是回溯时的重复计算,每次函数调用时参数的进栈出栈。所以,提高递归效率的方法就是减少重复计算。最简单的就是保存之前计算的结果。

举例说明,这是个常见的面试题:

对于一个递归函数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/

欢迎大家讨论更好的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值