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

  1. Создаёт две пустые переменные: res и tmp.
  2. Включает в res все атомы из списка, у которых индекс равен p.
  3. Если 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).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5
Похожие ответы