我想写一个函数,给定一个可能的嵌套列表将返回一个每个叶子的索引列表,这样我可以减少列表中的第n个和那些索引并获得每个叶子。例如:给定lst =((ab)c)因为(减少第n个lst [0 0])= a(减少第n个lst [0 1])= b,它将返回((0 0)和(减少第n个[1])= c。嵌套列表遍历
编辑:这是我的解决方案使用clojure.zip。任何人都可以想出一个更优雅的?
(defn tree-indexes [zipper matcher pos accumulator]
(loop [loc zipper pos pos accumulator accumulator]
(if (z/end? loc)
accumulator
(if (matcher (z/node loc))
(if (z/right loc)
(recur (z/next loc) (update-in pos [(- (count pos) 1)] inc) (conj accumulator [(z/node loc) pos]))
(if (z/end? (z/next loc))
(recur (z/next loc) pos (conj accumulator [(z/node loc) pos]))
(recur (z/next loc) (update-in (vec (butlast pos)) [(- (count (vec (butlast pos))) 1)] inc) (conj accumulator [(z/node loc) pos]))))
(recur (z/next loc) (conj pos 0) accumulator)))))
如果你想要的是为了叶子,你可以只使用'扁平化'。 – Alex