Рекурсия для списков - 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. Еслиcarla— этоnil, то рекурсивно вызывает функциюtaskдляini. 2.4. Еслиcarla— это атом, то возвращает его. 2.5. Еслиcarla— это неnil, то: 2.5.1. Рекурсивно вызывает функциюtaskдляcarla. 2.5.2. Если результатtaskдляcarlaне равенnil, то возвращает его. 2.5.3. Если результатtaskдляcarlaравенnil, то рекурсивно вызывает функциюtaskдляini. Таким образом, данный код реализует рекурсивную функцию для обработки списков.