Список, содержащий элементы первого списка, не принадлежащие второму - Lisp
Формулировка задачи:
Опишите функцию, аргументами которой являются два списка, а результатом — список, содержащий элементы первого списка (в том числе входящие в подсписки), не принадлежащие второму списку (в том числе входящие в подсписки).
так без подсписков, с подсписками никак не соображу (print (task-1 '((1 )2 3) '(3 (4 5))))
(defun task-1 (x y) (cond ((null y) x) ((null x) nil) ((member (car x) y) (task-1 (cdr x) y)) (t (cons (car x) (task-1 (cdr x) (cdr y)))))) (print (task-1 '(1 2 3) '(3 4 5)))
Решение задачи: «Список, содержащий элементы первого списка, не принадлежащие второму»
textual
Листинг программы
(defun set-distinction (w v) (set-difference (flatten w) (flatten v))) (defun flatten (w) (typecase w (cons (mapcan #'flatten w)) (t `(,w)))) > (set-distinction '(((0) ((1) 2)) (3)) '((((0)) (3)) (7))) (1 2)
Объяснение кода листинга программы
В коде представлена функция set-distinction
, которая принимает два аргумента — w
и v
.
Алгоритм работы следующий:
- Функция
flatten
принимает списокw
и возвращает список, состоящий из одного элемента — списка, полученного в результате примененияmapcan
кw
. Еслиw
— это не список, то возвращается самw
. - Функция
set-difference
принимает два аргумента —x
иy
. Вычисляет ихразность
— список, содержащий только те элементыx
, которых нет вy
. - В главной функции
(set-distinction '(((0) ((1) 2)) (3)) '((((0)) (3)) (7)))
происходит следующее: —w
— это список(((0) ((1) 2)) (3))
, который содержит два элемента — список(0 1 2)
и число3
. —v
— это список((((0)) (3)) (7))
, который содержит три элемента — список(0)
, число3
и число7
. — Функцияflatten
вызывается дляw
иv
с аргументамиw
иv
соответственно. — Результат работы функцииflatten
дляw
— это список(0 1 2 3)
, так какw
содержит список(0 1 2)
и число3
. — Результат работы функцииflatten
дляv
— это список(0 3 7)
, так какv
содержит список(0)
, число3
и число7
. — Результат работы функцииset-difference
для(0 1 2 3)
и(0 3 7)
— это список(1 2)
, так как(0 3 7)
содержит все элементы из(0 3 7)
, а(1 2)
не содержит. - Возвращаемый результат функции
set-distinction
— это список(1 2)
. - Возвращаемый результат функции
set-distinction
передается в качестве значения переменнойv
. - Результат выводится на экран.