Удалить из всех имеющихся подсписков заданной глубины элементы, находящиеся на указанной позиции - 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 — количество элементов на данной глубине, которые необходимо удалить, и возвращает новый список, в котором удалены элементы на заданной глубине и количестве. Код работает следующим образом:
- Функция del-lev-n рекурсивно вызывается для каждого элемента списка w.
- Если элемент является атомом, он возвращается без изменений.
- Если глубина вложенности равна 0, то вызывается функция del-n для удаления первого элемента списка a на заданной глубине.
- Если глубина вложенности больше 0, то вызывается функция del-lev-n для списка a на заданной глубине и количестве элементов m.
- Если элемент является списком, то удаляются элементы на заданной глубине и количестве, после чего возвращается новый список. Примеры вызовов функций: — (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).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д