Описать функцию, которая по атому и списку выдает множество всех атомов в списке - Lisp

Узнай цену своей работы

Формулировка задачи:

Опишите функцию послед(x, y, n), которая по атому x и списку y выдает множество всех атомов в y, непосредственно следующих за каждым вхождением x в y на заданном уровне n Помогите, пожалуйста!

Решение задачи: «Описать функцию, которая по атому и списку выдает множество всех атомов в списке»

textual
Листинг программы
  1. (defun task (x lst n &optional (p 0))
  2.   (let ((res nil) (tmp nil))
  3.     (cond ((= n p)
  4.            (dolist (i lst (reverse (flatten res)))
  5.              (when (and (eq (car tmp) x) (atom i)) (push i res))
  6.              (when (atom i) (push i tmp))))
  7.           ((< p n)
  8.            (dolist (i lst (reverse (flatten res)))
  9.              (when (listp i) (push (task x i n (+ p 1)) res))))
  10.           (t nil))))
  11.  
  12. ==> task
  13.  
  14. (task 'a '(a 1 (b 10 (c 100)) (b 10 (c 100 (d 1000)) e)) 0)
  15.  
  16. ==> (1)
  17.  
  18. (task 'b '(a 1 (b 10 (c 100)) (b 11 (c 100 (d 1000)) e)) 1)
  19.  
  20. ==> (10 11)
  21.  
  22. (task 'c '(a 1 (b 10 (c 100)) (b 11 (c 101 (d 1000)) e)) 2)
  23.  
  24. ==> (100 101)
  25.  
  26. (task 'd '(a 1 (b 10 (c 100)) (b 11 (c 101 (d 1000)) e)) 3)
  27.  
  28. ==> (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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы