【发布时间】:2011-12-30 01:50:24
【问题描述】:
我在 DrRacket 中使用 Intermediate Student with 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)))]))
,但是有一个问题,因为它没有保持顺序。有人可以指出我正确的方向吗?谢谢你的时间。
【问题讨论】:
-
实际上,它看起来确实保留了顺序,只是没有保留第一个重复元素。您确定您的解决方案不正确吗?
-
很遗憾,解决方案不正确。例如,如果我有删除重复项 (1 2 5 1 4),我想要 (list 1 2 5 4),而不是 (list 2 5 1 4) 的实际值。抱歉举了一个不好的例子。
-
我正在考虑在列表的第一个上做类似 cons 的事情,然后在列表的其余部分上使用过滤器和第一个数字。除了,我不知道如何实现哈哈。
-
如果你了解了累加器,我会考虑在这里使用它们(假设这是一个类)。
-
这个问题不需要累加器;你可以用一个辅助函数来做到这一点。我会考虑将其称为“删除”。渐近复杂度是一样的。