编写一个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))))))
答案 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))
。没有必要进行比较。