Работа со сложными списками - Lisp
Формулировка задачи:
Имеется сложный список.
(1 2 ( 3 ( 4 5 ) 6 ) 7 8 )
требуется удалить элементы 3 6 8
Итог выполнения ( 1 2 ( ( 4 5 ) ) 7)
Решение задачи: «Работа со сложными списками»
textual
Листинг программы
(defun remove-elms (w v) (loop for a in w if (listp a) collect (remove-elms a v) else unless (member a v) collect a)) > (remove-elms '(1 2 (3 (4 5) 6) 7 8) '(3 6 8)) (1 2 ((4 5)) 7)
Объяснение кода листинга программы
Функция remove-elms принимает два аргумента, w и v.
- Сначала она использует цикл
loopдля перебора каждого элементаaв спискеw. - Если элемент
aявляется списком, функция рекурсивно вызывает себя с аргументамиaиv, чтобы удалить соответствующие элементы из вложенного списка. - Если элемент
aне является списком, функция проверяет, является ли он членом спискаv. Если нет, то он добавляется в новый список. - В конце функция возвращает новый список без элементов, которые присутствуют в списке
v. В данном примере функцияremove-elmsпринимает списокw = (1 2 (3 (4 5) 6) 7 8)и списокv = (3 6 8). - Начинается перебор элементов списка
w. - Первый элемент
a = 1не является списком, поэтому он добавляется в новый список. - Второй элемент
a = 2также не является списком, поэтому он добавляется в новый список. - Третий элемент
a = (3 (4 5) 6)является списком, поэтому функция рекурсивно вызывается с аргументами(3 (4 5) 6)иv. - Вложенный список
(3 (4 5) 6)теперь проходит через ту же процедуру. - Четвертый элемент
a = 4не является списком, поэтому он добавляется в новый список. - Пятый элемент
a = 5также не является списком, поэтому он добавляется в новый список. - Шестой элемент
a = 6также не является списком, поэтому он добавляется в новый список. - Седьмой элемент
a = 7не является списком, поэтому он добавляется в новый список. - Восьмой элемент
a = 8также не является списком, поэтому он добавляется в новый список. - Функция завершает свою работу и возвращает новый список
(1 2 (4 5) 7 8).