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_S Expression_Zipper - Fatal编程技术网

计算树数据结构的深度-clojure

计算树数据结构的深度-clojure,clojure,s-expression,zipper,Clojure,S Expression,Zipper,我正在尝试实现一种算法,通过Clojure Zippers查找序列表达式的深度 (zip/seq-zip (+ 1 (* 2 3))) 这就是我解释要转换为树数据结构的序列的方式。是否有一种直接的方法通过拉链库来计算(根据给定的示例,深度计算为2) 如有任何建议,将不胜感激 您可以使用以下递归方法: (defn height [s-expr] (if-let [sub-trees (seq (filter coll? s-expr))] (inc (apply max

我正在尝试实现一种算法,通过Clojure Zippers查找序列表达式的深度

(zip/seq-zip (+ 1 (* 2 3)))
这就是我解释要转换为树数据结构的序列的方式。是否有一种直接的方法通过拉链库来计算(根据给定的示例,深度计算为2)


如有任何建议,将不胜感激

您可以使用以下递归方法:

(defn height [s-expr]
  (if-let [sub-trees (seq (filter coll? s-expr))]
    (inc
     (apply max
            (map height sub-trees)))
    0))


=> (height '(+ 1 (* 2 3)))
=> 1

上述方法有效地将集合视为分支,将其他所有内容视为叶子。您可以将
coll?
替换为符合您需要的任何其他分支定义(例如
list?

您可能需要计算树的最小高度和最大高度。 在这种情况下,您可以扩展到包含
comp
函数参数,以确定选择标准

;;计算高度(根据“comp”函数的最小值或最大值)
;; 树的“树”。树必须表示为嵌套序列。
(定义高度
[树木补偿]
(如果(coll?tree)
(inc(应用组件(映射#(高度%comp)树)))
0))
(定义最大高度[树](树最大高度))
(定义最小高度[树](树最小高度))

我的建议是不要使用拉链,因为拉链会让事情变得更复杂<代码>(fn深度[x](如果(序列x)(减少最大值0(贴图深度x))0))。一个拉链解决方案是我们乱扔运动指令,埋下lede。这将始终返回0。(fn深度[xd](如果(顺序x)(应用最大值(映射#(深度%(incd))x))d))。d最初应该是0。@turingcomplete true,谢谢——这是我没有测试代码得到的结果。由于
高度
是单参数形式,您可以将递归映射设置为
(映射高度子树)
供参考<如果f`返回一个数字,则代码>(应用最大值(映射f s))可以替换为
(应用最大键f s)。