Рекурсия для списков - 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, который является списком. Функция рекурсивно обрабатывает каждый элемент списка.

  1. Если lst — это nil, то функция возвращает nil.
  2. Если 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. Таким образом, данный код реализует рекурсивную функцию для обработки списков.

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


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

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

11   голосов , оценка 3.636 из 5
Похожие ответы