Рекурсия высокого порядка - Lisp
Формулировка задачи:
Необходимо сделать с помощью рекурсии высокого порядка реверс списка на всех уровнях. У меня получилось только на 1 уровне, дальше не могу разобраться((
А нужно чтобы получилось (4 (3 2) 1). Помогите пожалуйста.
(defun sam (x) (cond ((null x) x) ((null (cdr x)) x) (t (cons (car (sam (cdr x))) (sam (cons (car x) (sam (cdr (sam (cdr x)))))))))) sam '(1 (2 3) 4) (4 (2 3) 1)
Решение задачи: «Рекурсия высокого порядка»
textual
Листинг программы
(defun sam (x) (cond ((null x) x) ((atom (car x)) (append (sam (cdr x)) (list (car x)))) (t (append (sam (cdr x)) (list (sam (car x))))))) ==> SAM (sam '(1 2 (3 4) ((5 (6))))) ==> ((((6) 5)) (4 3) 2 1)
Объяснение кода листинга программы
В коде определён рекурсивный функционал с названием SAM. В данном случае SAM это синоним для функции с именем sam. Функция принимает в качестве входного аргумента x.
- Если x равно null, то возвращается x.
- Если (car x) является атомом, то (sam (cdr x)) и (list (car x)) добавляются в результат.
- Если (car x) не является атомом, то (sam (cdr x)) и (list (sam (car x))) добавляются в результат. Примеры использования функции SAM: (sam '(1 2 (3 4) ((5 (6)))))
- Вначале (sam (cdr x)) это (sam '(3 4) ((5 (6))).
- Затем (sam (cdr x)) это (sam '(5 (6))).
- В итоге получаем ((((6) 5)) (4 3) 2 1).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д