Определить функцию, аргументом которой является дерево. Функция должна вернуть ветвь с максимальным количеством листьев - Lisp

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

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

Ребята,помогите написать программу,я в Лиспе плохо разбираюсь,сформировать программу не могу,а сдавать уже завтра.В общем прошу помощи!
Алгоритм думаю будет такой: - Выделение веток, которые выходят из корня - Поиск в них, как в деревьях, максимума листьев - Выбор дерево с максимальным числом и поиск в нём конечной ветви от корня исходного дерева Только осталось закодить)
Помогите исправить ошибку,не пойму почему не работает...
(defun tree (maxlistnum  listnum)
       
              (let ((localmax 0) (buff ()) (way ()) (localtree (cdr listnum)))
                (if (not (eq (cdr listnum) () ))
                 ((setq way (car listnum))
                 (return 
                    (loop 
                    (if (eq localtree ()) (return (list '(localmax) '(way))))
                    (setq buff (tree (car localtree)))
                    (setq localtree (cdr localtree))
                        (if eq(buff '1) (+1 localmax)
                            (if (> (car buff) localmax) ((setq localmax (car buff)) (setq way (cdr buff))))
                    )
                  )
                    )
                 )
                (return 1) ) 
              )
              )

Решение задачи: «Определить функцию, аргументом которой является дерево. Функция должна вернуть ветвь с максимальным количеством листьев»

textual
Листинг программы
;; Дать следующую вершину 
 
(defun get-next (v graph chk)
  (dolist (pair graph nil)
     (cond ((eq (car pair) v) (unless (member (cadr pair) chk) (return (cadr pair))))
           ((eq (cadr pair) v) (unless (member (car pair) chk) (return (car pair)))))))
 
;; Перечисление путей обходом в глубину
 
(defun dfs (graph v &optional (chk nil) (pth nil) (r nil))
  (if (null v) r
    (let ((nv (get-next v graph chk))) 
      (if nv (dfs graph nv (cons nv chk) (cons nv pth) r)
             (dfs graph (cadr pth) chk (cdr pth) (cons pth r))))))
 
;; Вывод списка путей максимальной длины
 
(defun task (graph root)
  (let* ((pths (dfs graph root (list root) (list root)))
         (max-len (apply 'max (mapcar 'length pths)))) 
         (mapcar 'reverse (remove-if (lambda (p) (< (length p) max-len)) pths))))
 
;; Проверка
 
(setq *g* '((1 2) (1 3) (1 4) (2 5) (2 6) (2 7) (3 8) (8 9)))
 
==> ((1 2) (1 3) (1 4) (2 5) (2 6) (2 7) (3 8) (8 9))
 
(task *g* 1)
 
==> ((1 3 8 9))

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

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