Описать функцию, которая по атому и списку выдает множество всех атомов в списке - Lisp
Формулировка задачи:
Опишите функцию послед(x, y, n), которая по атому x и списку y выдает множество всех атомов в y, непосредственно следующих за каждым вхождением x в y на заданном уровне n
Помогите, пожалуйста!
Решение задачи: «Описать функцию, которая по атому и списку выдает множество всех атомов в списке»
textual
Листинг программы
(defun task (x lst n &optional (p 0)) (let ((res nil) (tmp nil)) (cond ((= n p) (dolist (i lst (reverse (flatten res))) (when (and (eq (car tmp) x) (atom i)) (push i res)) (when (atom i) (push i tmp)))) ((< p n) (dolist (i lst (reverse (flatten res))) (when (listp i) (push (task x i n (+ p 1)) res)))) (t nil)))) ==> task (task 'a '(a 1 (b 10 (c 100)) (b 10 (c 100 (d 1000)) e)) 0) ==> (1) (task 'b '(a 1 (b 10 (c 100)) (b 11 (c 100 (d 1000)) e)) 1) ==> (10 11) (task 'c '(a 1 (b 10 (c 100)) (b 11 (c 101 (d 1000)) e)) 2) ==> (100 101) (task 'd '(a 1 (b 10 (c 100)) (b 11 (c 101 (d 1000)) e)) 3) ==> (1000)
Объяснение кода листинга программы
В коде определена функция task
, которая принимает четыре аргумента: x
, lst
, n
и опциональный аргумент p
. Первые три аргумента являются обязательными, а четвёртый — опциональным. Значение p
по умолчанию равно 0.
Функция выполняет следующие действия:
- Создаёт две пустые переменные:
res
иtmp
. - Включает в
res
все атомы из списка, у которых индекс равенp
. - Если
n
равноp
, то выполняется следующее: 1) В обратном порядке перебираются все элементы изres
. 2) Если элементi
является атомом и равенx
, то он добавляется вres
. 3) Если элементi
является атомом, то он добавляется вtmp
. 4) Еслиn
меньшеp
, то выполняется следующее: 1) В обратном порядке перебираются все элементы изres
. 2) Если элементi
является списком, то вres
добавляется результат вызова функцииtask
дляx
,i
,n
иp
сp
увеличенным на 1. 5) Если элементi
является списком, то он добавляется вtmp
. 6) Если элементi
является атомом, то он добавляется вres
. 7) Если элементi
является списком и равенx
, то вres
добавляется результат вызова функцииtask
дляx
,i
,n
иp
сp
увеличенным на 1. 8) Еслиn
большеp
, то вres
добавляется пустой список. 9) Еслиn
равноp
, то вres
добавляется пустой список. 10) Еслиn
меньшеp
, то вres
добавляется пустой список. 11) Еслиn
равно 0, то вres
добавляется пустой список. 12) Результатом работы функции является значениеres
. Примеры вызовов функцииtask
: 1)task 'a '(a 1 (b 10 (c 100)) (b 11 (c 100 (d 1000)) e) 0
— результатом будет(1)
. 2)task 'b '(a 1 (b 10 (c 100)) (b 11 (c 101 (d 1000)) e) 1
— результатом будет(10 11)
. 3)task 'c '(a 1 (b 10 (c 100)) (b 11 (c 101 (d 1000)) e) 2
— результатом будет(100 101)
. 4)task 'd '(a 1 (b 10 (c 100)) (b 11 (c 101 (d 1000)) e) 3
— результатом будет(1000)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д