Рекурсия в лисп - Lisp

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

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

Добрый вечер! Задание таковое нужно со списка (a b c d e f g h) => ((h a) (g b) (f c) (e d)) нужно сделать через рекурсию у меня тут получилось , но можно ли сделать более проще? если конечно можно, спасибо
(defun fun (lst)
       (cond ( (null lst) nil)
        (T (cons (list (car (reverse lst)) (car lst)) (fun (reverse (cdr (reverse (cdr lst))))))
        )
       )
)
(setq x '(a b c d e f g h))
(print (fun x))

Решение задачи: «Рекурсия в лисп»

textual
Листинг программы
(defun edge-backward-pair (w)
  (when w (cons (append (last w) (list (car w)))
                (edge-backward-pair (butlast (cdr w))))))
 
> (edge-backward-pair '(a b c d e f g h))
((H A) (G B) (F C) (E D))

Объяснение кода листинга программы

В данном коде определён функционал для получения обратных пар ребра в направленном графе.

  1. (defun edge-backward-pair (w) — определение анонимной функции с именем edge-backward-pair, которая принимает один аргумент w.
  2. (when w (cons (append (last w) (list (car w))) — еслиwне равноnil, то рекурсивно вызывается функцияedge-backward-pairдляwсcdr wв качестве аргумента. — иначе, возвращаетсяnil`.
  3. (edge-backward-pair (butlast (cdr w)))) — рекурсивный вызов функции edge-backward-pair для butlast (cdr w) в качестве аргумента.
  4. (cons (append (last w) (list (car w)))) — конструктор cons создаёт новый список, где первый элемент — append (last w) (list (car w)), а второй элемент — результат рекурсивного вызова функции edge-backward-pair для w с cdr w в качестве аргумента.
  5. (last w) — возвращает последний элемент списка w.
  6. (car w) — возвращает первый элемент списка w.
  7. (butlast (cdr w)) — возвращает список, который является результатом удаления последнего элемента из cdr w.
  8. (append (last w) (list (car w))) — возвращает новый список, который является результатом объединения списка, возвращаемого last w, и списка, возвращаемого car w.
  9. (edge-backward-pair '(a b c d e f g h)) — вызывает функцию edge-backward-pair с аргументом (a b c d e f g h).
  10. ((H A) (G B) (F C) (E D)) — возвращаемый результат вызова функции edge-backward-pair с аргументом (a b c d e f g h).

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


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

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

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