Задача на рекурсию - Lisp

Узнай цену своей работы

Формулировка задачи:

Помогите описать функцию, которая, выдавала бы элемент списка по заданному номеру, считая от конца, учитывая элементы подсписков. Например, результатом применения функции к аргументам ’2 ’(a (b c (d)) e) должен быть ’d (второй с конца)

Решение задачи: «Задача на рекурсию»

textual
Листинг программы
(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.

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

7   голосов , оценка 3.286 из 5