Advertisement
Guest User

Untitled

a guest
Feb 9th, 2012
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.66 KB | None | 0 0
  1. ;; prima di tutto ci serve una rappresentazione dell'albero...
  2. (defparameter albero '(A (B (H (N NIL O) (I NIL J)) (C NIL (D NIL (E (K P (L Q NIL)) (F NIL (G M NIL))) NIL)))))
  3.  
  4. ;; come prima funzione usiamo questa, che ritorna una lista contenete la strada per arrivare dalla radice al nodo che ci interessa
  5. (defun strada-per-nodo (albero nodo)                                                        
  6.            "Ritorna una lista che rappresenta la strada per arrivare al nodo a partire dall'albero sp\
  7. ecificato."
  8.            (cond ((null albero) nil) ; albero vuoto
  9.                  ((atom albero) ; foglia
  10.                   (when (eq albero nodo)
  11.                         (list nodo)))
  12.                  ; ricorsione principale
  13.                  (t (let ((radice (first albero)))
  14.                       (if (eq radice nodo)
  15.                           (list nodo)
  16.                           (dolist (ramo (rest albero))
  17.                             (let ((strada (strada-per-nodo ramo nodo)))
  18.                               (when (member nodo strada)
  19.                                 (return (cons radice strada))))))))))
  20. ;; penso si potrebbe semplificare ulteriormente comunque...
  21.  
  22. ;; mentre antenato comune si puo' definire cosi'
  23. (defun antenato-comune (albero nodo1 nodo2)
  24.            "Trova l'antenato comune piu' vicino ai 2 nodi."                                          
  25.            (find-if-not #'null
  26.                         (reverse (mapcar #'(lambda (x y)
  27.                                              (when (eq x y) x))
  28.                                          (strada-per-nodo albero nodo1)
  29.                                          (strada-per-nodo albero nodo2)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement