您的位置:首页 > 其它

链表元素求和的伪递归优化

2007-11-15 16:43 218 查看

链表元素求和的伪递归优化

递归程序优化的一种广泛采用的技术是将递归程序转换为尾递归程序。所谓尾递归程序,是指程序仅仅在程序的最后一条语句才调用自身的程序。对于这类程序,已经开发出强有力的编译技术来加快程序的执行速度。举一个简单的例子来说明将递归程序转化为尾递归程序的思想,该程序用于统计一个链表中各项元素值的和,通常的递归程序为:
// Program ListSum_0
typedef struct tagList
{
int value;
struct tagList *next;
} List;

int EvalListSum(List *L)
{
if (L == (List *)NULL) return 0;
return L->value + EvalListSum(List->next);
}
看起来,EvalListSum是程序体中的最后一条语句,实际上不是这样,最后一条执行语句为执行加法操作的语句,如果将程序表示为下面的形式将更加清晰:
// Program ListSum_1
int EvalListSum(List *L)
{
int PartSum;

if (L == (List *)NULL) return 0;
PartSum = EvalListSum(List->next);
return L->value + PartSum;
}
上述程序可以改进为尾递归程序,相应的函数为:
// Program ListSum_2
int EvalListSum(List *L)
{
return EvalListSum(L, 0);
}

int EvalListSum0(List *L, int PartSum)
{
if (L == (List *)NULL) return PartSum;
PartSum +=L->value;
return EvalListSum1(L->next, PartSum);
}
函数的第二个参量用于记录部分和,函数的设计思想为:
(1) 当表为空时,部分和即最终结果;
(2) 若表不空,部分和需加上当前表元素的值,将它们的和作为新的部分和来进一步调用EvalListSum0。
(3) 在函数的初始调用中,PartSum=0,为了避免函数的调用者过多涉及函数设计的细节,可以继续使用EvalListSum作为原型提供给用户使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: