Clojure 不使用“展平”在树中查找最大值和最小值
我需要开发一个名为bounds的函数,它将嵌套的数字列表作为唯一的参数(即:树)。边界应返回树中的最大值和最小值。例如:Clojure 不使用“展平”在树中查找最大值和最小值,clojure,tree,max,min,Clojure,Tree,Max,Min,我需要开发一个名为bounds的函数,它将嵌套的数字列表作为唯一的参数(即:树)。边界应返回树中的最大值和最小值。例如: (bounds '(1 (-2 17 (4) -8 (-6 13) (-8 17)))) 使用clojure,而不是使用flatte函数,而是使用递归访问每个节点 (defn maxv[树] (续) (数字?树)树 让纽马克斯成为树上的第一个 (如果((sum tree nums1)45(defn v[tree](第二(数字树)tree)tree)(tree?tree)(
(bounds '(1 (-2 17 (4) -8 (-6 13) (-8 17))))
使用clojure,而不是使用flatte函数,而是使用递归访问每个节点
(defn maxv[树]
(续)
(数字?树)树
让纽马克斯成为树上的第一个
(如果(在剩下的时间里反复出现 这就是我所拥有的,我认为我太过java化了,因为扁平化非常有效,所以自己实现它没有任何好处 如果嵌套列表不太大,则可以将
直接应用于展开列表:
(defn bounds [coll]
(apply (juxt min max) (flatten coll)))
对于大型输入集合,我建议使用reduce
而不是apply
:
(defn bounds [coll]
(reduce (fn [[minv maxv :as res] v]
(if res [(min minv v) (max maxv v)] [v v]))
nil
(flatten coll)))
如果您确实需要纯递归实现,下面是一个示例:
(defn bounds [coll]
(loop [coll coll [minv maxv :as res] nil]
(if-let [[h & ts] (seq coll)]
(if (sequential? h)
(recur (concat h ts) res)
(recur ts (if res [(min minv h) (max maxv h)] [h h])))
res)))
这三种实现都将生成一个包含最小值和最大值的元组:
(bounds '(1 (-2 17 (4) -8 (-6 13) (-8 17)))) ; => [-8 17]
更新:注释中关于sum tree
实现的注释
在代码中使用它是一个非常糟糕的主意,因为它会非常快地摧毁您的堆栈:
(sum-tree (range 7000)) ; => java.lang.StackOverflowError
尝试与一起使用,或改为:
到目前为止,您尝试了什么?请包括您的代码,以便其他人可以在此基础上进行构建。@请注意,这显然不是编写代码的方式。我注意到您已经提出了类似的问题,并且您被赋予了“展平”为您进行递归的洞察力。此外,您没有显示任何您尝试的代码,以便我们可以为您提供指导。您还应该说明为什么“展平”对您不起作用。(defn sum tree[tree](第二(数字树)tree(树)tree(树)tree)(第二(数字树)(第一棵树))(sum tree(第二棵树)):else 0))(def nums1'(1(2)3)(4(5(6 7)8)9)))user=>(sum tree nums1)45(defn v[tree](第二(数字树)tree)tree)(tree?tree)(让[newmax(maxv(first tree))](如果(求和树的问题以及如何修复它。
(sum-tree (range 7000)) ; => java.lang.StackOverflowError
(defn sum-tree [tree]
(if (number? tree)
tree
(reduce + (map sum-tree tree))))