Рекурсия высокого порядка - 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).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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