Удаление элементов-списков - Lisp

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

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

А вот такой примерчик ещё у меня: Даны списки lst1 и lst2. Реализовать итерационную (без рекурсии) функцию, которая удаляет из lst1 все элементы-списки, которые соответствуют тому же множеству, что и lst2. Пример : для списков : lst1=’(1 (2 2 3) 4 (3 2 3) 5), lst2=’(2 2 3) результатом будет ’(1 4 (3 2 3) 5). Пример с рекурсией я нашёл, т.е.:
(defun rm (w v)
  (cond ((null w) nil)
        ((equal (car w) v) (rm (cdr w) v))
        ((cons (car w) (rm (cdr w) v)))))
рез-т: (rm '(1 (2 2 3) 4 (3 2 3) 5) '(2 2 3)) (1 4 (3 2 3) 5) С этим я разобрался, а вот как такую ф-цию сделать итерационным способом не получилось, пишет постоянные ошибки... вот что я навоял:
  (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)))
    )
)

Решение задачи: «Удаление элементов-списков»

textual
Листинг программы
(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).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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