Использование рекурсии - Lisp
Формулировка задачи:
Решение задачи: «Использование рекурсии»
- (defun flat (lst)
- (cond ((null lst) nil)
- ((atom (car lst)) (cons (car lst) (flat (cdr lst))))
- (t (append (flat (car lst)) (flat (cdr lst))))))
- ==> FLAT
- (defun pos-of-atom (lst a p)
- (cond ((null lst) nil)
- ((eq (car lst) a) p)
- (t (pos-of-atom (cdr lst) a (+ p 1)))))
- ==> POS-OF-ATOM
- (defun task (lst a)
- (pos-of-atom (flat lst) a 0))
- ==> TASK
- (task '(((a (3 b)) a (c x d)) (5 (a 8))) 'x)
- ==> 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д