Задать рекурсивную функцию обращения элементов списка - Lisp

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

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

Задать рекурсивную функцию обращения элементов списка (не используя встроенную функцию reverse). Оценить сложность реализации. Можно ли реализовать обращение списка за линейное время?

Решение задачи: «Задать рекурсивную функцию обращения элементов списка»

textual
Листинг программы
  1. (defun rev (lst &optional (r nil))
  2.   (if lst (rev (cdr lst) (cons (car lst) r)) r))
  3.  
  4. ==> REV
  5.  
  6. (rev '(1 2 3 4 5))
  7.  
  8. ==> (5 4 3 2 1)

Объяснение кода листинга программы

В коде определена рекурсивная функция rev с двумя аргументами: lst и опциональным r. Если lst не равно nil, то вызывается рекурсивный вызов функции rev с аргументами cdr lst и cons (car lst) r. Если lst равно nil, то в качестве результата возвращается r. При вызове функции rev с аргументом '(1 2 3 4 5)' будет выполнено следующее:

  1. rev вызывает себя рекурсивно с аргументами cdr lst и cons (car lst) r.
  2. cdr lst равен nil, поэтому рекурсивный вызов прекращается и в качестве результата возвращается r, который равен nil.
  3. cons (car lst) r возвращает '(5 4 3 2 1). Таким образом, результатом выполнения кода будет `'(5 4 3 2 1)'.

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


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

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

6   голосов , оценка 4.333 из 5

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

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

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