Реверс во всех подсписках четных уровней. Нечетные не трогать - Lisp

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

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

Здравствуйте! Необходимо создать функцию принимающую в качестве своего аргумента любой многоуровневый список вида (a b (c d (e f (g h)) i) (j (k (l m n)))) образовать результирующий список вида (a b (i (e f (h g)) d c) ((k (n m l)) j)) Будьте добры и подскажите хоть идеей, хоть кодом. Реверс могу делать на всех уровнях, но определять уровень вложенности как-то не пойму как. Вообще идеи не приходят.

Решение задачи: «Реверс во всех подсписках четных уровней. Нечетные не трогать»

textual
Листинг программы
(defun rev-ev-lev (w &optional (v 1))
  (when w (mapcar
           #'(lambda (a)
               (if (listp a)
                   (rev-ev-lev a (1+ v))
                   a))
           (if (evenp v) (reverse w) w))))
 
> (rev-ev-lev '(a b (c d (e f (g h)) i) (j (k (l m n)))))
(A B (I (E F (H G)) D C) ((K (N M L)) J))

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

В данном коде определён функционал для обратного преобразования элементов списка, основанный на их уровне чётности.

  1. (defun rev-ev-lev (w &optional (v 1)) — определение функции rev-ev-lev, которая принимает два аргумента: w — список, который необходимо изменить, и v — переменная, отвечающая за уровень глубины вложенности списка. Значение v по умолчанию равно 1.
  2. (when w (mapcar) — проверка на отсутствие пустого списка w. Если w не пустой, то выполняется следующая часть кода.
  3. #'(lambda (a) (if (listp a) — анонимная функция, которая рекурсивно вызывает себя для каждого элемента списка a. Если элемент является списком, то вызывается рекурсивно rev-ev-lev с аргументами a и v+1.
  4. (if (evenp v) (reverse w) w) — проверка значения переменной v на чётность. Если v — чётное число, то возвращается список w, перевёрнутый с помощью функции reverse.
  5. (rev-ev-lev '(a b (c d (e f (g h)) i) (j (k (l m n))))) — вызов функции rev-ev-lev с аргументами (a b (c d (e f (g h)) i) и (j (k (l m n))). В результате получаем (A B (I (E F (H G)) D C) ((K (N M L)) J). Таким образом, данный код реверсирует элементы списка, основываясь на их уровне чётности.

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

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