尝试实现删除相邻重复项的过程。它将一个列表作为输入并返回值作为值,同一列表中任何重复元素序列都缩减为单个元素:
示例:
(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)
如何做到这一点?
答案 0 :(得分:1)
以下是如何操作:
如果参数是空列表或cdr
是空列表,则结果是参数。
否则,如果第一个和第二个元素相同,则跳过第一个元素。
Else cons
第一个带有cdr
或参数递归的元素。例如。
(remove-adjacent-duplicates '(a b)) ; ==
(cons (car '(a b)) (remove-adjacent-duplicates (cdr '(a b))))
答案 1 :(得分:1)
这是一个解决方案 - 首先我们检查列表是否为空,如果没有 - 检查是否有重复的副本。
(define (strip-duplicates ls)
(if (null? ls)
'()
(let ((first (car ls)))
(let loop ((known first)
(rest (cdr ls))
(so-far (list first)))
(if (null? rest)
(reverse so-far)
(let ((first-remaining (car rest)))
(loop first-remaining
(cdr rest)
(if (equal? known first-remaining)
so-far
(cons first-remaining so-far)))))))))