You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:56:34