Дерево, вычисление максимального пути - 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)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д