从方案列表中删除所有重复项

时间:2018-03-02 21:45:14

标签: scheme

编写一个SCHEME函数remove-duplicatelicates,删除列表中的所有重复项。 (提示:您可以从定义一个函数开始,该函数从列表中删除特定给定值v的所有重复项;然后是什么?)

示例:

  

(remove-duplicates'(1 2 3 4 5 3 1))应该产生   '(1 2 3 4 5)

到目前为止,我有这个:

(define (remove v l)
  (if (null? l)
      l
      (if (equal? v (car l))
          (cdr l)
          (cons (car l)
                (remove v (cdr l))))))

(define (remove-duplicates l)
  (cond ((null? l) '())
        ((null? (cdr l)) l)
        ((equal? (car l) (car (cdr l)))
         (remove (cdr (cdr l)) (remove-duplicates (cdr (cdr l)))))
        (else (cons (car l) (remove-duplicates (cdr l))))))

1 个答案:

答案 0 :(得分:0)

抽象的全部意义在于,您可以使用更简单的代码来完成一些可测试的工作。你自己测试了remove吗?

(remove 'a '(g a b c a b c a))
; ==> (g b c a b c a)

因此,当找到一个匹配项时,列表的其余部分为(cdr l)。你只是期待一个副本吗?这是您解决方案中最重要的部分。

说到remove-duplicates,你做得太多了。当列表不为空时,第一个元素是与递归相关的结果的第一个元素,其中参数是第一个元素被移除的参数的其余部分。即。 (cons (car l) (remove-duplicates (remove (car l) (cdr l))。没有必要进行比较。