Описать функцию, которая по атому и списку выдает множество всех атомов в списке - 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).