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

 

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

递归程序优化的一种广泛采用的技术是将递归程序转换为尾递归程序。所谓尾递归程序,是指程序仅仅在程序的最后一条语句才调用自身的程序。对于这类程序,已经开发出强有力的编译技术来加快程序的执行速度。举一个简单的例子来说明将递归程序转化为尾递归程序的思想,该程序用于统计一个链表中各项元素值的和,通常的递归程序为:
// 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作为原型提供给用户使用。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值