Scheme删除相邻的重复项

时间:2018-04-08 11:38:31

标签: list scheme

尝试实现删除相邻重复项的过程。它将一个列表作为输入并返回值作为值,同一列表中任何重复元素序列都缩减为单个元素:

示例:

(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)

如何做到这一点?

2 个答案:

答案 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)))))))))