List 如何从Racket中可能包含列表的列表中删除重复项

List 如何从Racket中可能包含列表的列表中删除重复项,list,scheme,racket,List,Scheme,Racket,我写的代码是: (define (make-list lst) (cond [(null? lst) '()] [(member (car lst) (cdr lst)) (make-list (cdr L))] [else (cons (car lst) (duplicates (cdr lst)))])) 我希望(makelist'(a(abb(cb)3)55.0(es)(sesЮЮЮ))返回: (a(ab(cb)3)5(es)) 但我的程序回来了 '

我写的代码是:

 (define (make-list lst)
  (cond [(null? lst) '()]
        [(member (car lst) (cdr lst)) (make-list (cdr L))]
        [else (cons (car lst) (duplicates (cdr lst)))]))
我希望
(makelist'(a(abb(cb)3)55.0(es)(sesЮЮЮ))
返回:

(a(ab(cb)3)5(es))

但我的程序回来了

'((a b b (c b) 3) 5 5.0 (e s) (s e s))

因此,除了删除第一个元素之外,它实际上什么都不做,它不会进入嵌套列表。任何帮助都将不胜感激

我想重复的
L
都是被遗忘的重命名错误<代码>生成列表
并不是一个好名字,因为它是R7RS列表库中的一个众所周知的过程,最初来自SRFI-1列表库<代码>删除重复项可能更合适

(define (remove-duplicates lst)
  (cond [(null? lst) '()]
        [(member (car lst) (cdr lst))
         (remove-duplicates (cdr lst))]
        [else
         (cons (car lst) (remove-duplicates (cdr lst)))]))
现在,这将处理给定列表中的所有元素,它只涉及顶级列表。还比较了子列表:

(remove-duplicates '(a (b c) (b c) a))
; ==> ((b c) a)
您需要检查第一个元素是否是列表,而不仅仅是用第一个元素创建列表,并在两个部分上删除重复项。因此,您需要添加如下术语:

(define (remove-duplicates lst)
  (cond [(null? lst) '()]
        [(member (car lst) (cdr lst))
         (remove-duplicates (cdr lst))]
        [(list? (car lst)) ; or pair?
         (cons (remove-duplicates (car lst)) 
               (remove-duplicates (cdr lst)))]         
        [else
         (cons (car lst)
               (remove-duplicates (cdr lst)))]))

(remove-duplicates '((a b b a) (a b b a)))
; ==> ((b a))

你说这两部分是什么意思?名单上的car和cdr都是吗?@bullebullebagarn是的。
car
cdr
。还有一个极端情况。例如
((a b b a)(a b b a))
将成为
((b a))
,因为
成员的术语在
列表之前。如果你切换它们,你会得到
((b a)(b a))
。嗯,我还没能解决这个问题。在检查
(car lst)
是否为列表时,我添加了
(cons(删除重复项(car lst))(删除重复项(cdr lst)))
。但这并没有解决问题it@bullebullebagarn
5
5.0
“a”
不同于
'a
\a
。您可能需要自己的
my equal?
equal?
宽松,并在
删除重复项中使用它来删除结果中的重复项,而不是源中的重复项。您需要两次传递。