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

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

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

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

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

textual
Листинг программы
  1. (defun edge-backward-pair (w)
  2.   (when w (cons (append (last w) (list (car w)))
  3.                 (edge-backward-pair (butlast (cdr w))))))
  4.  
  5. > (edge-backward-pair '(a b c d e f g h))
  6. ((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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут