Список, содержащий элементы первого списка, не принадлежащие второму - Lisp

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

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

Опишите функцию, аргументами которой являются два списка, а результатом — список, содержащий элементы первого списка (в том числе входящие в подсписки), не принадлежащие второму списку (в том числе входящие в подсписки).
(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)))
так без подсписков, с подсписками никак не соображу (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. Алгоритм работы следующий:

  1. Функция flatten принимает список w и возвращает список, состоящий из одного элемента — списка, полученного в результате применения mapcan к w. Если w — это не список, то возвращается сам w.
  2. Функция set-difference принимает два аргумента — x и y. Вычисляет их разность — список, содержащий только те элементы x, которых нет в y.
  3. В главной функции (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) не содержит.
  4. Возвращаемый результат функции set-distinction — это список (1 2).
  5. Возвращаемый результат функции set-distinction передается в качестве значения переменной v.
  6. Результат выводится на экран.

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

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