Quelle serait une manière idiomatique de représenter un arbre dans Clojure? E.g .:Représenter un arbre dans Clojure
A
/\
B C
/\ \
D E F
Les performances ne sont pas importantes et les arbres ne dépasseront pas 1000 éléments.
Quelle serait une manière idiomatique de représenter un arbre dans Clojure? E.g .:Représenter un arbre dans Clojure
A
/\
B C
/\ \
D E F
Les performances ne sont pas importantes et les arbres ne dépasseront pas 1000 éléments.
'(A (B (D) (E)) (C (F)))
Il y a une façon effrayante de le faire en utilisant seulement 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)))
Notez que les enfants ne sont pas une liste; c'est une paire. Si vos arbres ne sont pas simplement binaires, vous pouvez en faire une liste. utilisez zéro quand il n'y a pas d'enfant gauche ou droit, bien sûr. Dans les autres cas, voir this answer.
L'arbre dans votre image:
(mktree 'A (mktree 'B (mktree 'D) (mktree 'E)) (mktree 'C nil (mktree 'F)))
il a d'abord et reste à la place de voiture cdr –
merci;) Lisp commun a les deux. je vais éditer. il a des «inconvénients» cependant? –
Je pense que vous devriez l'éditer pour dire "je ne connais que le lisp commun". Common Lisp n'est pas 'Lisp'. C'est * un * Lisp. – Rayne
Les arbres à peu près tout sous-tendent en Clojure parce qu'ils se prêtent si bien à un partage structurel dans la structure de données persistantes. Les cartes et vecteurs sont en réalité des arbres avec un facteur de branchement élevé pour leur donner une recherche bornée et insérer du temps. Donc, la réponse la plus courte que je peux donner (même si ce n'est pas vraiment utile) est que je recommande vraiment Purely functional data structures by Chris Okasaki pour une vraie réponse à cette question. Aussi la vidéo de Rich Hickey sur les structures de données Clojure sur blip.tv
(set 'A 'B 'C)
WTF est le problème avec les gens vous, chaque fois que quelqu'un n'aime pas la question qu'ils touchent de près. stackoverflow était un très bon endroit pour apprendre quelque chose maintenant, il est devenu digg, avec beaucoup d'idiots. Si vous n'aimez pas la question, c'est pour quoi voter pour. –
Ils ont voté pour le fermer, parce que c'est un doublon exact. – Rayne
D'accord; il ne s'agit pas de * aimer * la question; comme vous dites re apprendre quelque chose - peut-être apprendre de la dernière fois que quelqu'un a posé la même question? –