如何在Scheme语言中实现去除相邻重复元素的过程?
实现去除相邻重复元素的函数
这个需求在处理序列数据时挺常见的,用递归思路就能优雅解决——毕竟Lisp系语言对列表的递归操作天生友好。下面我会拆解思路并给出具体代码:
核心逻辑
我们可以通过递归遍历列表,每次只聚焦当前元素和下一个元素的关系:
- 如果列表是空的,直接返回空列表;
- 如果只有单个元素,直接返回这个单元素列表;
- 如果当前元素和下一个元素重复,就跳过当前元素,递归处理剩下的列表;
- 如果不重复,就保留当前元素,再把它和递归处理剩余列表的结果拼接起来。
Scheme 实现代码
(define (remove-adjacent-duplicates lst) (cond ((null? lst) '()) ; 空列表边界情况 ((null? (cdr lst)) lst) ; 单元素列表直接返回 ((equal? (car lst) (cadr lst)) ; 检查当前元素和下一个是否重复 (remove-adjacent-duplicates (cdr lst))) ; 重复则跳过当前元素,递归处理剩余部分 (else ; 不重复则保留当前元素,拼接递归结果 (cons (car lst) (remove-adjacent-duplicates (cdr lst))))))
测试验证
用题目里的例子测试完全符合预期:
- 输入
(remove-adjacent-duplicates ’(y a b b a d a b b a d o o)),返回'(y a b a d a b a d o); - 输入
(remove-adjacent-duplicates ’(yeah yeah yeah)),返回'(yeah)。
Common Lisp 版本(可选)
如果用的是Common Lisp,逻辑完全一致,只是语法稍有调整:
(defun remove-adjacent-duplicates (lst) (cond ((null lst) nil) ((null (cdr lst)) lst) ((equal (car lst) (cadr lst)) (remove-adjacent-duplicates (cdr lst))) (t (cons (car lst) (remove-adjacent-duplicates (cdr lst))))))
这个实现逻辑简单清晰,还能处理任意可被equal?/equal判断相等性的元素类型,实用性拉满。
内容的提问来源于stack exchange,提问作者Adam Morad
相关产品推荐
相关产品推荐

