Scheme 删除相邻的重复项

Scheme 删除相邻的重复项,scheme,racket,Scheme,Racket,我想实现一个函数,该函数以列表作为输入,并以值的形式返回相同的列表,其中任何重复元素的序列都减少为单个元素: 例如: (remove-adjacent-duplicates ’(y a b b a d a b b a d o o)) ; the return'(y a b a d a b a d o) (remove-adjacent-duplicates ’(yeah yeah yeah)) ;the return '(yeah) 我已通过以下代码实现了这一点: (define (remo

我想实现一个函数,该函数以列表作为输入,并以值的形式返回相同的列表,其中任何重复元素的序列都减少为单个元素:

例如:

(remove-adjacent-duplicates ’(y a b b a d a b b a d o o)) ; the return'(y a b a d a b a d o)

(remove-adjacent-duplicates ’(yeah yeah yeah)) ;the return '(yeah)
我已通过以下代码实现了这一点:

(define (remove-adjacent-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))))))))) 
但是代码并不漂亮,并且包含循环。我想要一个使用诸如“car”、“cdr”和“cons”等实用程序的递归代码

循环是内部过程的名称,递归调用;查找命名的let。你可以给它取你想要的名字;在我的例子中,我称之为iter以避免这种混淆

您还可以简化一点:

(define (remove-adjacent-duplicates lst)
  (let iter ((lst lst) (res '()))
    (if (null? lst)
        (reverse res)
        (let ((next (car lst)))
          (iter (cdr lst)
                (if (or (null? res) (not (equal? next (car res))))
                    (cons next res)
                    res))))))