Рекурсия высокого порядка - Lisp

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

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

Необходимо сделать с помощью рекурсии высокого порядка реверс списка на всех уровнях. У меня получилось только на 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)
А нужно чтобы получилось (4 (3 2) 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.

  1. Если x равно null, то возвращается x.
  2. Если (car x) является атомом, то (sam (cdr x)) и (list (car x)) добавляются в результат.
  3. Если (car x) не является атомом, то (sam (cdr x)) и (list (sam (car x))) добавляются в результат. Примеры использования функции SAM: (sam '(1 2 (3 4) ((5 (6)))))
  4. Вначале (sam (cdr x)) это (sam '(3 4) ((5 (6))).
  5. Затем (sam (cdr x)) это (sam '(5 (6))).
  6. В итоге получаем ((((6) 5)) (4 3) 2 1).

ИИ для рефератов и докладов


  • Экспорт Word по ГОСТу
  • Минимум 80% уникальности текста
  • Поиск релевантных источников в интернете
  • Готовый документ за 2 минуты

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

5   голосов , оценка 4.2 из 5