2009-11-24 21 views
39

¿Cuál sería una forma idiomática de representar un árbol en Clojure? Por ejemplo:Representando un árbol en Clojure

 A 
    /\ 
    B C 
    /\ \ 
D E F 

El rendimiento no es importante y los árboles no crecerán más allá de 1000 elementos.

+27

WTF está mal con ustedes, cada vez que alguien no le gusta la pregunta que golpeó cerca. stackoverflow era un muy buen lugar para aprender algo, ahora ha comenzado a digg, con muchos idiotas. Si no te gusta la pregunta, para qué sirve el voto negativo. –

+4

Votaron para cerrarlo, porque es un duplicado exacto. – Rayne

+1

De acuerdo; esto no se trata de * me gusta * la pregunta; como dices, estás aprendiendo algo, ¿quizás aprendes de la última vez que alguien hizo la misma pregunta? –

Respuesta

30
'(A (B (D) (E)) (C (F))) 
5

Hay una forma de miedo de hacerlo usando sólo cons:

(defn mktree 
    ([label l r] (cons label (cons l r))) 
    ([leaf] (cons leaf (cons nil nil)))) 
(defn getlabel [t] (first t)) 
(defn getchildren [t] (rest t)) 
(defn getleft [t] (first (getchildren t))) 
(defn getright [t] (rest (getchildren t))) 

Tenga en cuenta que los niños no es una lista; es un par Si tus árboles no son solo binarios, podrías hacer una lista. use nil cuando no haya un niño izquierdo o derecho, por supuesto.

De lo contrario, consulte this answer.

El árbol en su imagen:

(mktree 'A (mktree 'B (mktree 'D) (mktree 'E)) (mktree 'C nil (mktree 'F))) 
+1

tiene first & rest en lugar de cdr del coche –

+0

gracias;) common lisp tiene ambos. voy a editar tiene "contras" sin embargo? –

+0

Creo que debería editarlo para decir "Solo conozco el ceceo común". Common Lisp no es 'Lisp'. Es * a * Lisp. – Rayne

3

árboles subyacen a casi todo en Clojure porque se prestan tan bien a compartir estructural en estructuras de datos persistentes. Los mapas y los vectores son en realidad árboles con un alto factor de ramificación para darles una búsqueda limitada e insertar tiempo. Así que la respuesta más breve que puedo dar (aunque no es realmente tan útil) es que realmente recomiendo Purely functional data structures by Chris Okasaki para una respuesta real a esta pregunta. También de vídeo de Rich Hickey en estructuras de datos Clojure en blip.tv

(set 'A 'B 'C) 
Cuestiones relacionadas