【背景】

已知f为单链表的表头指针,链表中存储的是整形数据,试写出实现下列运算的递归算法:

1、求链表中的最大整数

2、求链表的节点个数

3、求所有整数的平均值

【源码运行环境】

操作系统:Windows 10

编译环境:Dev C++(基于C99标准)

【思路】

1、构造递归体结束条件(当前访问的节点为NULL)

2、构造递归体操作

3、尽可能使用尾递归操作

【源码实现】

/*

*方法名:findMax

*作用:递归查找链表中的最大值

*参数:链表指针 l, 最大值指针 max ;

*返回值:void

*Author: WellLee

*Last Modified: 2018-12-13 13:28:30

*/

void findMax(Link l, int *max)

{

Link temp = l;

if(temp == NULL)

{

return;

}

if(temp->elem > *max)

{

*max = l->elem;

}

findMax(temp->next, max);

}

/*

*方法名:getLength1

*作用:递归求链表长度

*参数:链表指针 l, 长度指针 length ;

*返回值:void

*Author: WellLee

*Last Modified: 2018-12-13 13:28:30

*/

void getLength1(Link l, int *length)

{

Link temp = l;

if(temp == NULL)

{

return;

}

*length += 1;

getLength1(temp->next, length);

}

/*

*方法名:average

*作用:递归求所有整数的平均值

*参数:链表指针 l,计数器:total, 平均值指针:avg, 链表长度: i ;

*返回值:void

*Author: WellLee

*Last Modified: 2018-12-13 13:28:30

*/

void average(Link l, int total, float *avg, int i)

{

Link temp = l;

if(temp == NULL)

{

*avg = (float)(total) / i;

return;

}

total += temp->elem;

average(temp->next, total, avg, i + 1);

}

【总结】

递归的方法有很多,尾递归是一种能够在一定程度上减低空间复杂度的递归算法。

【参考文献】

《数据结构习题解析与实验指导》.李冬梅,张琪.人民邮电出版社

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐