Функция Scheme для удаления элементов одного списка из другого - PullRequest
2 голосов
/ 02 июня 2011

Я пытаюсь создать функцию схемы, которая с учетом двух списков L1 и L2 удалит все элементы, присутствующие в L2, из L1.

У меня маленький старт, но я точно не знаю, что еще делать.

(define (remove L1 L2)
(((null? L2) L1))

Ответы [ 2 ]

1 голос
/ 02 июня 2011

Вот фрагмент кода для простого случая.

(define (remove L1 L2)
  (cond ((null? L1) '())
        ((memv (car L1) L2) (remove (cdr L1) L2))
        (else  (cons (car L1) (remove (cdr L1) L2)))))

Помните, что в Схеме или любом другом функциональном языке вам нужно задать вопрос не «что мне делать?«, а лучше спросить « какое значение мне нужно получить? ».

Обратите внимание, что этот простой пример не обрабатывает вложенные списки.Так что (remove '(A (C D)) '(B C D)) даст (A (C D)).Обработка вложенных списков оставлена ​​читателю в качестве упражнения: D

0 голосов
/ 02 июня 2011

Вы можете просто использовать SRFI 1 lset-difference:

(lset-difference = '(1 2 3 4 5) '(3 4 5 5 6))
; => (1 2)

=, в моем примере, является функцией сравнения.Если ваши списки содержат строки, скажем, вместо чисел, то вам следует использовать string=? вместо =.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...