我在DrRacket中使用Lambda的中级学生,我想知道如何在保持顺序的同时删除列表中的重复项.例如(remove-dup (list 2 5 4 5 1 2))
会产生(list 2 5 4 1)
.到目前为止,我有这个:
(define (remove-duplicates lst)
(cond
[(empty? lst) empty]
[(member? (first lst) (rest lst))
(remove-duplicates (rest lst))]
[else (cons (first lst) (remove-duplicates (rest lst)))]))
Run Code Online (Sandbox Code Playgroud)
,但由于没有保留订单,因此存在问题.有人能指出我正确的方向吗?谢谢你的时间.
Eli*_*lay 11
如果您的目标是使功能正常工作,而不是一些功课问题,那么您不需要做任何事情,只需使用remove-duplicates
:
Welcome to Racket v5.2.
-> (remove-duplicates (list 2 5 4 5 1 2))
'(2 5 4 1)
Run Code Online (Sandbox Code Playgroud)
小智 5
这是解决方案:
(define (remove-duplicates lon)
(foldr (lambda (x y) (cons x (filter (lambda (z) (not (= x z))) y))) empty lon))
Run Code Online (Sandbox Code Playgroud)
SRFI-1 有delete-duplicates
,尽管效率低下。(我对 Racket 不太熟悉,但它肯定有 SRFI-1,以及来源......)
http://srfi.schemers.org/srfi-1/srfi-1.html#delete-duplicates