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

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

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

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

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

textual
Листинг программы
  1. (defun elt-from-end (n w)
  2.   (car (last (flat w nil) n)))
  3.  
  4. (defun flat (w acc)
  5.   (cond ((null w) acc)
  6.         ((atom w) (cons w acc))
  7.         ((flat (car w) (flat (cdr w) acc)))))
  8.  
  9. > (elt-from-end 2 '( 1 2 3 4 5))
  10. 4
  11. > (elt-from-end 2 '( 1 2 (3 (4)) 5))
  12. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут