Задача на рекурсию - Lisp
Формулировка задачи:
Решение задачи: «Задача на рекурсию»
(defun elt-from-end (n w) (car (last (flat w nil) n))) (defun flat (w acc) (cond ((null w) acc) ((atom w) (cons w acc)) ((flat (car w) (flat (cdr w) acc))))) > (elt-from-end 2 '( 1 2 3 4 5)) 4 > (elt-from-end 2 '( 1 2 (3 (4)) 5)) 4
Объяснение кода листинга программы
В коде представлена функция elt-from-end, которая, принимая два аргумента, n и w, рекурсивно обращается к последнему элементу списка w и возвращает n-й элемент из этого списка.
Также в коде представлена функция flat, которая принимает два аргумента, w и acc, и рекурсивно обрабатывает каждый элемент списка w. Если w является атомным значением, оно добавляется в аккумулятор acc. Если w является списком, то рекурсивно вызывается функция flat для первого элемента списка, а затем результат добавляется в аккумулятор acc. Если w равно nil, то возвращается аккумулятор acc.
Код был протестирован с двумя тестовыми примерами. В первом примере elt-from-end вызывается с аргументами 2 и (1 2 3 4 5), и возвращается значение 4. Во втором примере elt-from-end вызывается с аргументами 2 и '(1 2 (3 (4)) 5', и также возвращается значение 4.