Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 不使用“展平”在树中查找最大值和最小值_Clojure_Tree_Max_Min - Fatal编程技术网

Clojure 不使用“展平”在树中查找最大值和最小值

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的函数,它将嵌套的数字列表作为唯一的参数(即:树)。边界应返回树中的最大值和最小值。例如:

(bounds '(1 (-2 17 (4) -8 (-6 13) (-8 17)))) 
使用clojure,而不是使用flatte函数,而是使用递归访问每个节点

(defn maxv[树] (续) (数字?树)树

让纽马克斯成为树上的第一个 (如果( 把newmax换成这个 (重复出现(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))))