Реверс многоуровневого списка - Lisp
Формулировка задачи:
Помогите c защитой) можно ли эту программу написать более простым способом. не используя (lambda,mapcar и тд.) ?
Поставлена задача (реверсировать только подсписки, четных степеней вложения.)
пример: как должна выглядеть задача:
Реверсировать произвольный список (включая подсписки).
(defun invert (lst) (reverso lst Nil)) (defun reverso (lst lst2) (cond ((Null lst) lst2) ((listp (car lst)) (reverso (cdr lst) (cons (reverso (car lst) Nil) lst2))) (t (reverso (cdr lst) (cons (car lst) lst2)))))
Так как будет выглядеть задача ? (реверсировать только подсписки, четных степеней вложения.) ? заранее спасибо)
Решение задачи: «Реверс многоуровневого списка»
textual
Листинг программы
(defun task (lst &optional (lv 0)) (mapcar #'(lambda (x) (if (listp x) (task x (+ lv 1)) x)) (if (evenp lv) (reverse lst) lst))) ==> task (task '(1 2 3 (4 5 6) ((7 8 9) 10 11 12))) ==> (((9 8 7) 10 11 12) (4 5 6) 3 2 1)
Объяснение кода листинга программы
В данном коде определен вспомогательный функтор «task», который рекурсивно обрабатывает каждый элемент списка «lst». Если элемент является списком, то он передается в функцию «task» с увеличенным значением переменной «lv» на единицу. Если значение переменной «lv» является четным числом, то список «lst» передается в обратном порядке. В итоге получается список, в котором каждый вложенный список перевернут. Список переменных и их значений:
- lst — исходный список
- lv — счетчик, увеличивающийся на единицу при каждом рекурсивном вызове функции
- x — текущий элемент списка
- y — результат обработки текущего элемента функции
- reversed lst — список «lst», перевернутый на 180 градусов
- result — итоговый результат работы функции
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д