Рекурсия для списков - Lisp
Формулировка задачи:
Всем привет. Найти последний отличный от NIL атом в заданном списке: (A B (S 1) ((C)) NIL) —> C
Помогите пожалуйста. Заранее спасибо
Решение задачи: «Рекурсия для списков»
textual
Листинг программы
(defun task (lst) (cond ((null lst) nil) (t (let ((la (last lst)) (ini (butlast lst))) (cond ((null (car la)) (task ini)) ((atom (car la)) (car la)) (t (let ((tmp (task (car la)))) (if tmp tmp (task ini))))))))) ==> task (task '(A B (S 1) ((C)) NIL)) ==> c (task '(A B (S 1) ((NIL)) NIL)) ==> 1
Объяснение кода листинга программы
В коде определён функцией task
с одним аргументом lst
, который является списком. Функция рекурсивно обрабатывает каждый элемент списка.
- Если
lst
— этоnil
, то функция возвращаетnil
. - Если
lst
неnil
, то: 2.1. Получает последний элемент спискаla
. 2.2. Получает список без последнего элементаini
. 2.3. Еслиcar
la
— этоnil
, то рекурсивно вызывает функциюtask
дляini
. 2.4. Еслиcar
la
— это атом, то возвращает его. 2.5. Еслиcar
la
— это неnil
, то: 2.5.1. Рекурсивно вызывает функциюtask
дляcar
la
. 2.5.2. Если результатtask
дляcar
la
не равенnil
, то возвращает его. 2.5.3. Если результатtask
дляcar
la
равенnil
, то рекурсивно вызывает функциюtask
дляini
. Таким образом, данный код реализует рекурсивную функцию для обработки списков.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д