Вывести элементы 1го списка, не содержащего эл-ты остальных списков - Lisp

Узнай цену своей работы

Формулировка задачи:

Всем привет! Задача в следующем: задается n - ое количество списков, нужно вывести 1 - ый список таким, чтобы он не содержал элементы остальных списков. У меня сделано для строго фиксированного количества списков, а мне нужно, чтобы количество было произвольным. Заранее спасибо!
(defun SR (SP1 SP2 SP3)
(setq SP ())(foreach EL1 SP1
(if (and (not (member EL1 SP2)) (not (member EL1 SP3)))
(setq SP (cons EL1 SP))
)
)
(reverse SP)

Решение задачи: «Вывести элементы 1го списка, не содержащего эл-ты остальных списков»

textual
Листинг программы
(defun f (l &rest lsts)
  (remove-if #'(lambda (e)
                 (dolist (i lsts nil)
                         (when (member e i) (return t))))
             l))
F
[2]> (f '(1 2 3 4 5 6 7 8 9) '(1 3) '(3 5) '(5 7) '(7 9) '(9 11) '(11 13))
(2 4 6 8)

Объяснение кода листинга программы

В данном коде определённая функция f принимает первый аргумент l — список, который необходимо проверить, и остальные аргументы lsts — списки, которые необходимо учесть при проверке. Для решения поставленной задачи используется функция remove-if, которой в качестве первого аргумента передаётся лямбда-функция с заданным условием. В данном случае условие задано так, чтобы оставлять только те элементы из первого списка, которые не содержатся в остальных списках. В лямбда-функции с помощью цикла dolist перебираются все элементы списков lsts. Для каждого элемента проверяется, содержится ли текущий элемент из первого списка в данном списке. Если содержится, то лямбда-функция возвращает t, иначе возвращает nil. В функции remove-if возвращается новый список, в котором удалены все элементы, для которых лямбда-функция вернула t. Таким образом, результатом выполнения кода будет список, содержащий только элементы первого списка, которые не содержатся в остальных списках.

Оцени полезность:

14   голосов , оценка 4.143 из 5
Похожие ответы