Удалить из всех имеющихся подсписков заданной глубины элементы, находящиеся на указанной позиции - Lisp

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

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

Заданы глубина подсписка и позиция. Удалить из всех имеющихся подсписков заданной глубины элементы, находящиеся на указанной позиции.

Решение задачи: «Удалить из всех имеющихся подсписков заданной глубины элементы, находящиеся на указанной позиции»

textual
Листинг программы
(defun del-lev-n (w n m &aux (a (car w)) (d (cdr w)))
  (when w (cons (cond ((atom a) a)
                      ((= n 0) (del-n a m))
                      ((del-lev-n a (1- n) m)))
                (del-lev-n d n m))))
 
(defun del-n (w n)
  (when w (if (= n 1)
              (cdr w)
              (cons (car w) (del-n (cdr w) (1- n))))))
 
> (del-lev-n '(a b (1 2 3 (1 2 3 (1 2 3))) c d) 0 2)
(A B (1 3 (1 2 3 (1 2 3))) C D)
> (del-lev-n '(a b (1 2 3 (1 2 3 (1 2 3))) c d) 1 2)
(A B (1 2 3 (1 3 (1 2 3))) C D)
> (del-lev-n '(a b (1 2 3 (1 2 3 (1 2 3))) c d) 2 2)
(A B (1 2 3 (1 2 3 (1 3))) C D)
> (del-lev-n '(a b (1 2 3 (1 2 3 (1 2 3))) c d) 3 2)
(A B (1 2 3 (1 2 3 (1 2 3))) C D)

Объяснение кода листинга программы

В коде представлено два функтора del-n и del-lev-n. Функция del-n принимает три аргумента: w — список, n — глубина вложенности, на которой необходимо удалить элементы, и возвращает новый список, в котором удалены элементы на заданной глубине. Функция del-lev-n принимает четыре аргумента: w — список, n — глубина вложенности, m — количество элементов на данной глубине, которые необходимо удалить, и возвращает новый список, в котором удалены элементы на заданной глубине и количестве. Код работает следующим образом:

  1. Функция del-lev-n рекурсивно вызывается для каждого элемента списка w.
  2. Если элемент является атомом, он возвращается без изменений.
  3. Если глубина вложенности равна 0, то вызывается функция del-n для удаления первого элемента списка a на заданной глубине.
  4. Если глубина вложенности больше 0, то вызывается функция del-lev-n для списка a на заданной глубине и количестве элементов m.
  5. Если элемент является списком, то удаляются элементы на заданной глубине и количестве, после чего возвращается новый список. Примеры вызовов функций: — (del-lev-n '(a b (1 2 3 (1 2 3 (1 2 3))) c d) 0 2) — удаляет элементы на глубине 0 и 2 из списка (a b (1 2 3 (1 2 3 (1 2 3)))) и возвращает (A B (1 3 (1 2 3 (1 2 3))) C D). — (del-lev-n '(a b (1 2 3 (1 2 3 (1 2 3))) c d) 1 2) — удаляет элементы на глубине 1 и 2 из списка (a b (1 2 3 (1 2 3 (1 2 3))) c d) и возвращает (A B (1 2 3 (1 3 (1 2 3))) C D). — (del-lev-n '(a b (1 2 3 (1 2 3 (1 2 3))) c d) 2 2) — удаляет элементы на глубине 2 и 2 из списка (a b (1 2 3 (1 2 3 (1 2 3))) c d) и возвращает (A B (1 2 3 (1 2 3 (1 3))) C D). — (del-lev-n '(a b (1 2 3 (1 2 3 (1 2 3))) c d) 3 2) — удаляет элементы на глубине 3 и 2 из списка (a b (1 2 3 (1 2 3 (1 2 3))) c d) и возвращает (A B (1 2 3 (1 2 3 (1 2 3))) C D).

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


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

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

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