Я предполагаю, что duplicates
и L
забыли ошибки переименования.make-list
на самом деле не очень хорошее имя, поскольку это хорошо известная процедура в библиотеке списков R7RS, изначально из библиотеки списков SRFI-1.remove-duplicates
может быть лучше подходит?
(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)
Вам нужно вместо того, чтобы просто составить список с первым элементом, также проверить, является ли первый элемент списком, и выполнить remove-duplicates
для обеих частей.Таким образом, вам нужно добавить такой термин:
(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))