Рекурсия в лисп - 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))
Объяснение кода листинга программы
В данном коде определён функционал для получения обратных пар ребра в направленном графе.
(defun edge-backward-pair (w)— определение анонимной функции с именемedge-backward-pair, которая принимает один аргументw.(when w (cons (append (last w) (list (car w))) — еслиwне равноnil, то рекурсивно вызывается функцияedge-backward-pairдляwсcdr wв качестве аргумента. — иначе, возвращаетсяnil`.(edge-backward-pair (butlast (cdr w))))— рекурсивный вызов функцииedge-backward-pairдляbutlast (cdr w)в качестве аргумента.(cons (append (last w) (list (car w))))— конструкторconsсоздаёт новый список, где первый элемент —append (last w) (list (car w)), а второй элемент — результат рекурсивного вызова функцииedge-backward-pairдляwсcdr wв качестве аргумента.(last w)— возвращает последний элемент спискаw.(car w)— возвращает первый элемент спискаw.(butlast (cdr w))— возвращает список, который является результатом удаления последнего элемента изcdr w.(append (last w) (list (car w)))— возвращает новый список, который является результатом объединения списка, возвращаемогоlast w, и списка, возвращаемогоcar w.(edge-backward-pair '(a b c d e f g h))— вызывает функциюedge-backward-pairс аргументом(a b c d e f g h).((H A) (G B) (F C) (E D))— возвращаемый результат вызова функцииedge-backward-pairс аргументом(a b c d e f g h).