Рекурсия для списков - 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
. Таким образом, данный код реализует рекурсивную функцию для обработки списков.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д