Необычный вывод позиции найденного элемента в ЛЮБОМ списке - Lisp

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

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

Помогите пожалуйста!!!! Если не сложно - с комментариями! Lisp мне не поддается...((( ЗАДАЧА: В нелинейном списке найти заданный элемент (м.б., не атом). Результат выдать в виде линейного списка (отдельный список для каждого вхождения), каждый элемент которого является индексом очередного сегмента поиска. Если элемент не найден, выдать 0.

Решение задачи: «Необычный вывод позиции найденного элемента в ЛЮБОМ списке»

textual
Листинг программы
  1. (defun task (item lst &optional (p 0) (r nil) (res nil))
  2.   (cond ((null lst) res)
  3.         ((equal (car lst) item) (task item (cdr lst) (+ p 1) r (append res (list (reverse (cons p r))))))
  4.         ((listp (car lst))
  5.          (let ((tmp (task item (car lst) 0 (cons p r) nil)))
  6.               (task item (cdr lst) (+ p 1) r (append res tmp))))
  7.         (t (task item (cdr lst) (+ p 1) r res))))
  8.  
  9. ==> task
  10.  
  11. (task '(8 5) '(8 5 (8 5) 1 1 (1 (8 5)) 1 (1 ((8 5) 1))))
  12.  
  13. ==> ((2) (5 1) (7 1 0))
  14.  
  15. (task 1 '(8 5 (8 5) 1 1 (1 (8 5)) 1 (1 ((8 5) 1))))
  16.  
  17. ==> ((3) (4) (5 0) (6) (7 0) (7 1 1))

Объяснение кода листинга программы

В этом коде определённая функция task, которая принимает три аргумента: item, lst и два необязательных аргумента p и r. Если p не указан, он по умолчанию равен 0. Если r не указан, он по умолчанию равен nil. Функция task выполняет следующие действия:

  1. Если lst равно nil, функция возвращает res.
  2. Если car lst равно item, функция вызывает саму себя, передавая item, cdr lst, p + 1 и r в качестве аргументов. Она также добавляет p в конец res.
  3. Если car lst является списком, функция вызывает саму себя, передавая item, cdr lst, p + 1 и r в качестве аргументов. Она также добавляет результат вызова функции, в котором p увеличивается на 1, в конец res.
  4. Если car lst не является списком, функция вызывает саму себя, передавая item, cdr lst, p + 1 и r в качестве аргументов. В данном примере функция task вызывается с аргументами '(8 5)', '(8 5 (8 5) 1 1 (1 (8 5)) 1 (1 ((8 5) 1))', 1 и nil соответственно. Функция ищет все вхождения '8 5' в списке и возвращает список позиций, где '8 5' встречается, в порядке их появления. В этом примере результат будет (2) (5 1) (7 1 0). Если бы мы использовали task с аргументом '1', мы бы получили (3) (4) (5 0) (6) (7 0) (7 1 1).

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


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

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

5   голосов , оценка 4.2 из 5

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

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

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