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

问题描述 投票:0回答:1

这个问题在这里已有答案:

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

例:

(删除重复'(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))))))
scheme
1个回答
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))。没有必要进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.