Представляя дерево в Clojure

43
задан Zaz 21 September 2015 в 20:28
поделиться

3 ответа

'(A (B (D) (E)) (C (F)))
34
ответ дан 26 November 2019 в 23:08
поделиться

Есть страшный способ сделать это, используя только минусы :

(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)))
5
ответ дан 26 November 2019 в 23:08
поделиться

Деревья лежат в основе практически всего. в Clojure, потому что они прекрасно поддаются структурному разделению в постоянной структуре данных. Карты и векторы на самом деле являются деревьями с высоким коэффициентом ветвления, что дает им ограниченное время поиска и вставки. Итак, самый короткий ответ, который я могу дать (хотя на самом деле он не так полезен), это то, что я действительно рекомендую чисто функциональные структуры данных Криса Окасаки для реального ответа на этот вопрос. Также видео Рича Хики о структурах данных Clojure на blip. tv

(set 'A 'B 'C)
3
ответ дан 26 November 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: