Удаление элементов-списков - Lisp
Формулировка задачи:
(defun rm (w v) (cond ((null w) nil) ((equal (car w) v) (rm (cdr w) v)) ((cons (car w) (rm (cdr w) v)))))
(defun rm2 (w v) ( (setf l () ) (loop for e in w ((cond (null e) (print(l)))) ((equal e v) (setf w (cdr w))) (T (cons e 'l)) ) )
(defun rm2 (w v) ((setf l ()) ; (loop for e in w do ((cond (null e) (print(l)))) ((equal e v) (setf w (cdr w))) (T (setf l (cons e l))) ) )
Решение задачи: «Удаление элементов-списков»
(defun drop-set (w v) (when w (let ((a (car w)) (d (cdr w))) (if (or (atom a) (nset-difference a v)) (cons a (drop-set d v)) (drop-set d v))))) > (drop-set '((2 3 2 3) 8 (2 3) (2 7) (2) (2 2 3) 5) '(3 2 3 2)) (8 (2 7) 5)
Объяснение кода листинга программы
В коде представлена функция drop-set, которая принимает два аргумента: w и v. В первом аргументе w содержится список, из которого необходимо удалить элементы, которые являются подмножеством v. Второй аргумент v — это список, который задает подмножество, элементы которого необходимо удалить из первого аргумента. Список разбивается на две части: a — первый элемент списка и d — оставшаяся часть списка. Проверяется, является ли a атомом или множеством. Если это так, то он добавляется в новый список, который возвращается функцией. Если это не так, то рекурсивно вызывается функция drop-set для d и v. Если a является множеством, то функция drop-set вызывается рекурсивно для d и v. Если a является атомом, то он добавляется в новый список, который возвращается функцией. Если a не является множеством или атомом, то вызывается функция drop-set для d и v. В данном примере функция drop-set принимает список ((2 3 2 3) 8 (2 3) (2 7) (2) (2 2 3) 5) и список (3 2 3 2). Первый аргумент разбивается на a = (2 3 2 3) и d = 8 (2 3) (2 7) (2) (2 2 3) 5. Для a = (2 3 2 3) происходит проверка на атом или множество. Так как это не атом и не множество, вызывается функция drop-set для d = 8 (2 3) (2 7) (2) (2 2 3) 5 и v = (3 2 3 2). Для d = 8 (2 3) (2 7) (2) (2 2 3) 5 происходит проверка на атом или множество. Так как это не атом и не множество, вызывается функция drop-set для d = (2 3) (2 7) (2) (2 2 3) 5 и v = (3 2 3 2). Для d = (2 3) (2 7) (2) (2 2 3) 5 происходит проверка на атом или множество. Так как это не атом и не множество, вызывается функция drop-set для d = (2 7) (2) (2 2 3) 5 и v = (3 2 3 2). Для d = (2 7) (2) (2 2 3) 5 происходит проверка на атом или множество. Так как это не атом и не множество, вызывается функция drop-set для d = (2) (2 2 3) 5 и v = (3 2 3 2). Для d = (2) (2 2 3) 5 происходит проверка на атом или множество. Так как это не атом и не множество, вызывается функция drop-set для d = (2 2 3) 5 и v = (3 2 3 2). Для d = (2 2 3) 5 происходит проверка на атом или множество. Так как это не атом и не множество, вызывается функция drop-set для d = 5 и v = (3 2 3 2). Для d = 5 и v = (3 2 3 2) происходит проверка на атом или множество. Так как это не атом и не множество, вызывается функция drop-set для d = () и v = (3 2 3 2). Так как d = (), функция drop-set возвращает пустой список. Функция drop-set возвращает список (8 (2 7) 5), так как это результат вызова функции drop-set для аргументов '((2 3 2 3) 8 (2 3) (2 7) (2) (2 2 3) 5) и '(3 2 3 2).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д