如何在Clojure中以习惯用语的方式表示树?例如:
A
/ \
B C
/\ \
D E F
性能不重要,而且树的元素数量不会超过1000个。
如何在Clojure中以习惯用语的方式表示树?例如:
A
/ \
B C
/\ \
D E F
性能不重要,而且树的元素数量不会超过1000个。
'(A (B (D) (E)) (C (F)))
使用仅 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)))
(mktree 'A (mktree 'B (mktree 'D) (mktree 'E)) (mktree 'C nil (mktree 'F)))
树在Clojure中几乎贯穿了所有内容,因为它们非常适合持久数据结构中的结构共享。映射和向量实际上是具有高分支因子的树,以使它们具有有界的查找和插入时间。所以我能给出的最短答案(虽然并不真正有用)是我强烈推荐Purely functional data structures by Chris Okasaki来回答这个问题。此外,Rich Hickey在blip.tv上关于Clojure数据结构的视频也很值得一看。
(set 'A 'B 'C)