Реверс многоуровневого списка - 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 — итоговый результат работы функции
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д