1

我想编写一个函数,给定一个可能嵌套的列表,它将返回每个叶子的索引列表,这样我就可以用 nth 和这些索引减少列表并获得每个叶子。例如:给定 lst = ((ab) c) 它会返回 ((0 0) (0 1) (1)) 因为 (reduce nth lst [0 0]) = a (reduce nth lst [0 1]) = b和 (减少第 n 个 lst [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)))))
4

1 回答 1

1

我有一个(非尾)递归解决方案,但可能有某种迭代方法:

(defn list-indices
  ([l] (list-indices l []))
  ([l parent-indices]
   (->> l
        (map-indexed
          (fn [i element]
            (let [indices (conj parent-indices i)]
              (if (sequential? element)
                (list-indices element indices)
                [indices]))))
        (apply concat))))
于 2013-11-04T15:21:11.413 回答