Использование рекурсии - Lisp

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

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

Здравствуйте, помогите, пожалуйста! Нужно описать функцию, используя функции car и cdr, которая определяла бы положение атома в списке (возвращала бы порядковый номер атома в списке), учитывая все атомы подсписков. Например, результатом применения функции к аргументам ’x ’((a (3 b)) a (c x d)) (5 (a 8))) должен быть 5 – нумерация начинается с 0.

Решение задачи: «Использование рекурсии»

textual
Листинг программы
  1. (defun flat (lst)
  2.   (cond ((null lst) nil)
  3.         ((atom (car lst)) (cons (car lst) (flat (cdr lst))))
  4.         (t (append (flat (car lst)) (flat (cdr lst))))))
  5.  
  6. ==> FLAT
  7.  
  8. (defun pos-of-atom (lst a p)
  9.   (cond ((null lst) nil)
  10.         ((eq (car lst) a) p)
  11.         (t (pos-of-atom (cdr lst) a (+ p 1)))))
  12.  
  13. ==> POS-OF-ATOM
  14.  
  15. (defun task (lst a)
  16.   (pos-of-atom (flat lst) a 0))
  17.  
  18. ==> TASK
  19.  
  20. (task '(((a (3 b)) a (c x d)) (5 (a 8))) 'x)
  21.  
  22. ==> 5

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

В коде представлена функция flat, которая принимает в качестве аргумента список lst и возвращает список, содержащий только один уровень вложенности. Рекурсивный базовый случай составляет NULL-значение, которое передаётся в качестве значения для всех дочерних элементов. Функция pos-of-atom принимает три аргумента: список lst, атом a и индекс p. Если lst — NULL, то возвращается NULL. Если car lst равен a, то возвращается p. В противном случае рекурсивно вызывается функция pos-of-atom для cdr lst, при этом p увеличивается на 1. Функция task принимает два аргумента: список lst и атом a. Она вызывает функцию pos-of-atom с аргументами flat lst и a, передаёт результат в функцию flat, и возвращает результат. Вызывается функция task с аргументами '(((a (3 b)) a (c x d)) (5 (a 8))) и 'x'. Функция flat преобразует входной список в список с одним уровнем вложенности, затем функция pos-of-atom вызывается с аргументами '((a (3 b)) a (c x d))' и 'x', и возвращает 5. Итоговый результат: 5.

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


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

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

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

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

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

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