Дерево, вычисление максимального пути - Lisp

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

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

Здравствуйте. Необходимо, чтобы программа высчитывала длину максимальной цепочки в дереве, при этом проходящий через заданное множество вершин. Дерево бинарное. Код для вычисления максимального пути прилагаю.
Листинг программы
  1. (defun glubina(tree)
  2. (cond ((NULL tree)
  3. 0)
  4. ( T
  5. (+ 1 (max (glubina (cadr tree)) (glubina(cddr tree)))))
  6. )
  7. )
  8. (defun way(tree spisok)
  9. (cond ((NULL tree)
  10. spisok)
  11. ( ( > (glubina (cadr tree)) (glubina (caddr tree)))
  12. (way (cadr tree) (append spisok (list(car tree)))))
  13. ( T
  14. (way (caddr tree) (append spisok (list(car tree)))))
  15. )
  16. )
  17.  
  18. (defun test ()
  19. (way '(a (b (d) (e)) (c (g (h (i)) (k)))) '())
  20. )
Заранее спасибо.

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

textual
Листинг программы
  1. ;; небольшой довесок:
  2.  
  3. (defun task (tree setv)
  4.   (let ((p (max-len-path tree)))
  5.     (car (remove-if-not (lambda (x) (every (lambda (y) (member y x)) setv)) p))))
  6.  
  7. ==> task
  8.  
  9. (task '(((nil c nil) a ((nil g nil) d nil)) r ((nil e (nil h nil)) b (nil f nil))) '(b e))
  10.  
  11. ==> (r b e h)
  12.  
  13. (task '(((nil c nil) a ((nil g nil) d nil)) r ((nil e (nil h nil)) b (nil f nil))) '(a d))
  14.  
  15. ==> (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

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

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

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