Функция reverse, произвольный список - Lisp

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

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

Привет. Помогите изменить данную функцию без встроенной reverse функции
 (defun ddin (h n)
 (cond
  ((null n) nil)
 ((> h 0) (ddin (- h 1) (reverse n)))
  ( (not(atom (car n))) ( cons (ddin (+ h 1) (car n)) (ddin h (cdr n))) )
  (t (cons (car n) (ddin h (cdr n))))
  )
)
(defun din (n)
  (ddin 1 n)
)

Решение задачи: «Функция reverse, произвольный список»

textual
Листинг программы
(defun reverse_ (w &optional acc)
  (cond ((null w) acc) 
        ((atom (car w))(reverse_ (cdr w) (cons (car w) acc)))
        (T (reverse_ (cdr w) (cons (reverse_(car w)) acc)))))

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

В данном коде определена функция reverse_, которая принимает два аргумента: w и acc. Переменная w является произвольным списком, а acc — это аккумулятор, который используется для накопления результата. Функция использует конструкцию cond для проверки трех условий:

  1. Если w равно nil, то возвращается значение acc.
  2. Если (car w) является атомом, то рекурсивно вызывается функция reverse_ для списка (cdr w), а результат добавляется в acc с помощью cons.
  3. Если (car w) не является атомом, то рекурсивно вызывается функция reverse для списка (cdr w), а результат добавляется в acc с помощью cons и reverse. Таким образом, функция reverse рекурсивно обрабатывает каждый элемент списка w, добавляя его в acc в обратном порядке. В итоге, в acc будет содержаться обратный список w. Пример использования функции: (reverse (list 1 2 3)) В этом случае, функция будет вызвана следующим образом: (reverse (list 2 3) (list 1)) (reverse (list 3) (list 1 2)) (reverse_ (list) (list 1 2 3)) В результате, будет возвращен список (3 2 1), так как элементы были добавлены в acc в обратном порядке.

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


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

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

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