Дерево, вычисление максимального пути - 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)))) '())
)
Заранее спасибо.

Решение задачи: «Дерево, вычисление максимального пути»

textual
Листинг программы
;; небольшой довесок:
 
(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).

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


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

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

5   голосов , оценка 4 из 5
Похожие ответы