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