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