【发布时间】:2016-04-23 08:16:40
【问题描述】:
考虑以下由向量嵌套在树形结构中的数字
(def tree [7 9 [7 5 3 [4 6 9] 9 3] 1 [2 7 9 9]])
我的目标是通过遍历树找到第一个偶数的路径:在上面的示例中,这将是 4,从根到该节点的路径将是 [2 3 0]
(def result [2 3 0])
我在编写一个函数来归档它时遇到了一些困难。但是,下面的函数会找到第一个偶数,而不是它的路径:
(defn find-even [x]
(if (vector? x)
(some #(when-let [subresult (find-even %)]
(when (even? subresult)
subresult)) x)
x))
(find-even tree) ;; 4
我需要做什么才能获得结果的路径?
编辑
我想出了一个办法。这是一个 - 至少 - 有效的函数:
(defn find-even-path [x]
(letfn [(traverse [x]
(if (vector? x)
(some (fn [[i v]] (when-let [subresult (traverse v)]
(when (even? (:value subresult))
(update subresult :path conj i))))
(map-indexed vector x))
{:path '()
:value x}))]
(when-let [result (traverse x)]
(vec (:path result)))))
(find-even-path tree) ;; [2 3 0]
但是,我仍然很想知道这里可以优化什么。它在我看来仍然很复杂,而且还不是尾递归的。
【问题讨论】:
标签: clojure functional-programming clojurescript tail-recursion