Clojure平顺序到树

时间:2015-07-21 20:54:38

标签: clojure tree zipper

我有以下向量,[ - 1 1 2 -1 3 0 -1 2 -1 4 0 3 0 0]

代表树[[1 2 [3] [2 [4] 3]]]

其中-1开始一个新分支,0结束它。如何将原始矢量转换为可用的树状clojure结构(嵌套矢量,嵌套映射)?我认为clojure.zip/zipper可能会这样做,但我不确定如何构建这些函数args。

3 个答案:

答案 0 :(得分:6)

拉链是一个很好的工具:

sudo -u $user "$db2 connect to $DBname ; $db2 quiesce database immediate force connections"

答案 1 :(得分:3)

不知怎的,这就像是作弊:

[(read-string
  (clojure.string/join " "
                       (replace {-1 "[" 0 "]"}
                                [-1 1 2 -1 3 0 -1 2 -1 4 0 3 0 0])))]

答案 2 :(得分:2)

这对于一些递归来说并不太难:

(defn numbers->tree [xs]
  (letfn [(step [xs]
            (loop [ret [], remainder xs]
              (if (empty? remainder)
                [ret remainder]
                (let [x (first remainder)]
                  (case x
                    0 [ret (next remainder)]
                    -1 (let [[ret' remainder'] (step (next remainder))]
                         (recur (conj ret ret'), remainder'))
                    (recur (conj ret x) (next remainder)))))))]
    (first (step xs))))

我们的想法是找到一个找到子树的函数(step),并返回该树以及剩下要处理的数字。它对大多数输入进行迭代(通过loop),并在遇到-1时启动自身的递归实例。唯一棘手的部分是确保使用从这些递归调用返回的remainder,而不是继续使用您在中间的列表。