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

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

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

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

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

textual
Листинг программы
(defun task (item lst &optional (p 0) (r nil) (res nil))
  (cond ((null lst) res)
        ((equal (car lst) item) (task item (cdr lst) (+ p 1) r (append res (list (reverse (cons p r))))))
        ((listp (car lst)) 
         (let ((tmp (task item (car lst) 0 (cons p r) nil)))
              (task item (cdr lst) (+ p 1) r (append res tmp))))
        (t (task item (cdr lst) (+ p 1) r res))))
 
==> task
 
(task '(8 5) '(8 5 (8 5) 1 1 (1 (8 5)) 1 (1 ((8 5) 1))))
 
==> ((2) (5 1) (7 1 0))
 
(task 1 '(8 5 (8 5) 1 1 (1 (8 5)) 1 (1 ((8 5) 1))))
 
==> ((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
Похожие ответы