Ответ 1
'(A (B (D) (E)) (C (F)))
Каким будет идиоматический способ представления дерева в 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)))
Обратите внимание, что дети не являются списком; это пара. Если ваши деревья не только двоичные, вы можете составить список. используйте nil, если нет левого или правого ребенка, конечно.
В противном случае см. этот ответ.
Дерево на картинке:
(mktree 'A (mktree 'B (mktree 'D) (mktree 'E)) (mktree 'C nil (mktree 'F)))
Деревья лежат почти во всем, что есть в Clojure, потому что они так хорошо подходят для структурного обмена в постоянной структуре данных. Карты и векторы - это фактически деревья с высоким коэффициентом ветвления, чтобы дать им ограниченный поиск и время вставки. Поэтому самый короткий ответ, который я могу дать (хотя это и не так уж и полезно), - это то, что я действительно рекомендую Чисто функциональные структуры данных Криса Окасаки для реального ответьте на этот вопрос. Также Rich Hickey видео на Clojure структурах данных на blip.tv
(set 'A 'B 'C)