Я не уверен, что понимаю, что вы пытаетесь сделать, но примеры подсказывают мне, что индексы, присвоенные узлам, соответствуют количеству их левых братьев и сестер (поскольку во втором примере оба корневых узлаи 6
ребенок помечен 0
). Обновление: очевидно, я просто неправильно прочитал пример visit
в первый раз - это проясняет намерение ... К счастью, теперь, когда я прочитал его правильно, мне кажется, что ответ ниже верен.
Если это правильно, это решение на основе clojure.walk/postwalk
:
(defn index-vec-tree [vt]
[0 (walk/postwalk
(fn [node]
(if-not (vector? node)
node
(vec (map-indexed vector node))))
vt)])
С приведенными примерами:
user> (index-vec-tree [6 7])
[0 [[0 6] [1 7]]]
user> (index-vec-tree 42)
[0 42]
Обновление: Простое решение с использованием map-indexed
(доступно в версии 1.2; используйте map
+ clojure.contrib.seq-utils/indexed
в версии 1.1):
(defn index-vec-tree [vt]
(letfn [(iter [i vt] [i (if (vector? vt)
(vec (map-indexed iter vt))
vt)])]
(iter 0 vt)))