Erlang递归实现:移除列表倒数第二个元素并追加指定元素
Erlang递归实现列表操作:移除倒数第二个元素并追加指定元素
针对你需要实现的remove_penultimate/1函数,咱们可以用递归遍历列表的方式搞定,不用计算列表长度就能定位并移除倒数第二个元素。核心想法就是在递归过程中识别出列表的最后两个元素,此时跳过倒数第二个,只保留最后一个;对于前面的元素,则正常递归保留。
完整实现代码
-module(task). -export([remove_and_add/1]). remove_and_add(List) -> % 先移除倒数第二个元素,再追加第2和第5个元素 remove_penultimate(List) ++ [nth(2, List)] ++ [nth(5, List)]. % 递归获取第N个元素 nth(1, [H|_]) -> H; nth(N, [_|T]) when N > 1 -> nth(N - 1, T). % 移除倒数第二个元素的递归实现 % 空列表直接返回 remove_penultimate([]) -> []; % 单个元素没有倒数第二个,直接返回原列表 remove_penultimate([X]) -> [X]; % 只剩两个元素时,跳过倒数第二个,返回最后一个 remove_penultimate([_Penultimate, Last]) -> [Last]; % 递归处理:保留当前头元素,继续处理剩余列表 remove_penultimate([H | T]) -> [H | remove_penultimate(T)].
逻辑说明
remove_penultimate/1递归逻辑- 如果列表是空的或者只有一个元素,直接返回原列表(没东西可删)
- 要是列表刚好两个元素,就只返回最后一个(把倒数第二个删掉)
- 更长的列表就把当前第一个元素留着,递归处理剩下的部分,最后拼起来就行
nth/2的小优化- 加了
when N > 1的判断,避免N是0或者负数的时候无限递归
- 加了
测试示例
% 测试用例:原列表[1,2,3,4,5,6] % 移除倒数第二个元素5后得到[1,2,3,4,6],再追加第2个元素2和第5个元素5,最终结果是[1,2,3,4,6,2,5] 1> task:remove_and_add([1,2,3,4,5,6]). [1,2,3,4,6,2,5]
内容的提问来源于stack exchange,提问作者Ted Mosby
相关产品推荐
相关产品推荐

