Списки здесь очень неуклюжие, не говоря уже о неэффективности. В Clojure более идиоматично использовать векторы, хэш-карты и множества, когда это уместно. Использование хеш-карт:
(def in-tree
'((1 2)
(1 2 3)
(1 2 4 5 9)
(1 2 4 10 15)
(1 2 4 20 25)))
(defn add-to-trie [trie x]
(assoc-in trie `(~@x :terminal) true))
(defn in-trie? [trie x]
(get-in trie `(~@x :terminal)))
Если вы хотите, чтобы он печатал отсортированные, вы могли бы вместо этого использовать sorted-map
s, но вам нужно было бы написать свою собственную версию assoc-in
, которая использовала бы отсортированные карты весь путь вниз. В любом случае:
user> (def trie (reduce add-to-trie {} in-tree))
#'user/trie
user> trie
{1 {2 {4 {20 {25 {:terminal true}}, 10 {15 {:terminal true}}, 5 {9 {:terminal true}}}, 3 {:terminal true}, :terminal true}}}
user> (in-trie? trie '(1 2))
true
user> (in-trie? trie '(1 2 4))
nil
user> (in-trie? trie '(1 2 4 20 25))
true