Удаление элементов-списков - 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).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д