Дерево, вычисление максимального пути - Lisp
Формулировка задачи:
(defun glubina(tree)
(cond ((NULL tree)
0)
( T
(+ 1 (max (glubina (cadr tree)) (glubina(cddr tree)))))
)
)
(defun way(tree spisok)
(cond ((NULL tree)
spisok)
( ( > (glubina (cadr tree)) (glubina (caddr tree)))
(way (cadr tree) (append spisok (list(car tree)))))
( T
(way (caddr tree) (append spisok (list(car tree)))))
)
)
(defun test ()
(way '(a (b (d) (e)) (c (g (h (i)) (k)))) '())
)Решение задачи: «Дерево, вычисление максимального пути»
;; небольшой довесок: (defun task (tree setv) (let ((p (max-len-path tree))) (car (remove-if-not (lambda (x) (every (lambda (y) (member y x)) setv)) p)))) ==> task (task '(((nil c nil) a ((nil g nil) d nil)) r ((nil e (nil h nil)) b (nil f nil))) '(b e)) ==> (r b e h) (task '(((nil c nil) a ((nil g nil) d nil)) r ((nil e (nil h nil)) b (nil f nil))) '(a d)) ==> (r a d g)
Объяснение кода листинга программы
В коде определена функция task, которая принимает два аргумента: tree и setv.
Список tree представляет собой дерево, где каждый узел является списком, содержащим дочерние узлы, представленные в виде списков, и значения, представленные в виде атомов.
Функция setv принимает один аргумент и возвращает список, содержащий значения, которые соответствуют вершинам дерева.
В функции task создается переменная p, которая инициализируется максимальным количеством вершин в дереве.
Затем используется функция remove-if-not, которая удаляет все элементы из списка p, которые не соответствуют условию. Условие задается с помощью лямбда-функции, которая проверяет, содержит ли каждый элемент списка setv все вершины дерева.
Наконец, функция возвращает первый элемент списка p, который является максимальным путем в дереве.
Пример использования функции task показывает, как она применяется к двум спискам: (((nil c nil) a ((nil g nil) d nil)) r ((nil e (nil h nil)) b (nil f nil))) и setv в качестве аргументов. В первом примере максимальным путем является (r b e h), а во втором примере — (r a d g).