链表元素求和的伪递归优化
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作为原型提供给用户使用。
相关文章推荐
- 《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(非递归)
- 【Weiss】【第03章】练习3.11:比较单链表递归与非递归查找元素
- java实现单向链表CRUD,反转,排序,查找倒数第k个元素,递归输出等操作
- python 列表递归求和、计数、求最大元素
- 递归实现删除链表中值为x的元素
- 递归删除链表中的指定元素x
- 链表插入元素的三种递归实现 -- 简单递归,数据累加器,函数累加器
- 链表有环判断,快慢指针两种方法/合并链表/删除重复元素/二分递归和while
- 10.2-7 O(n)非递归逆转单向链表的n个元素。
- 不带头结点的单链表递归删除元素为X的结点
- 链表中递归查找元素,非递归查找元素 以及基数排序(未完成)josephus问题(未完成)
- 《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(递归)
- 递归--九度1460.Oil Deposit【待优化】
- 【转载】利用CPU缓存的特性优化数据存储---数组vs链表
- 【LintCode-452】删除链表中的元素(Java实现)
- 合并单链表,输出单链表中间元素,判断是否有环等
- 非递归实现两个有序链表
- 输入一个链表,反转链表后,输出链表的所有元素。就地逆转,头插法
- [C++]LeetCode: 108 Add Two Numbers (反序链表求和)
- 递归、非递归 反转单链表