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