Clojure 使用深度优先搜索顺序将嵌套地图展平到列表中
在clojure中,如何像这样打开嵌套贴图:Clojure 使用深度优先搜索顺序将嵌套地图展平到列表中,clojure,nested-map,Clojure,Nested Map,在clojure中,如何像这样打开嵌套贴图: {"1" {"1.1" {"1.1.1" {} "1.1.2" {}} "1.2" {}} "2" {"2.1" {} "2.2" {} "2.3" {}}} 为此: ("1" "1.1" "1.1.1" "1.1.2" "1.2" "2" "2.1" "2.2" "2.3") 下面是一个递归解决方案: (defn flatten-map [m] (flatten (fo
{"1" {"1.1" {"1.1.1" {}
"1.1.2" {}}
"1.2" {}}
"2" {"2.1" {}
"2.2" {}
"2.3" {}}}
为此:
("1" "1.1" "1.1.1" "1.1.2" "1.2" "2" "2.1" "2.2" "2.3")
下面是一个递归解决方案:
(defn flatten-map [m]
(flatten
(for [[k v] m]
(cons k (flatten-map v)))))
下面是一个递归解决方案:
(defn flatten-map [m]
(flatten
(for [[k v] m]
(cons k (flatten-map v)))))
下面是一个使用循环和递归的简单迭代解决方案: defn展平贴图[m] 循环[in m out[]] 如果让[[[k v]&ts]顺序进入] 复发性鼻窦炎 拼凑出k 出来 还有一个漂亮的 defn展平贴图[m] ->>[零米] 树序列?第二 下降1 先绘制地图
下面是一个使用循环和递归的简单迭代解决方案: defn展平贴图[m] 循环[in m out[]] 如果让[[[k v]&ts]顺序进入] 复发性鼻窦炎 拼凑出k 出来 还有一个漂亮的 defn展平贴图[m] ->>[零米] 树序列?第二 下降1 先绘制地图
在这里使用flatte是一个非常糟糕的主意。你应该使用一些非递归的方法,例如apply concat。你能解释一下原因吗?不反对你的承诺本身并不坏。这种特殊情况是否会导致大量开销或损害性能?如果是这样,我可以看到循环/重复将如何帮助。展平也可能会产生不想要的结果。例如,尝试用函数展平{1{[11]{}[12]{}}}。与预期的[1[1 1][1 2]]相反,您的函数将生成一个展平的[1 1 2]。我想说的是,只有当您希望展平某些深度未知的嵌套数据结构时,才应该使用展平。但是有更好的方法来执行一级展平。在这里使用展平是一个非常糟糕的主意。你应该使用一些非递归的方法,例如apply concat。你能解释一下原因吗?不反对你的承诺本身并不坏。这种特殊情况是否会导致大量开销或损害性能?如果是这样,我可以看到循环/重复将如何帮助。展平也可能会产生不想要的结果。例如,尝试用函数展平{1{[11]{}[12]{}}}。与预期的[1[1 1][1 2]]相反,您的函数将生成一个展平的[1 1 2]。我想说的是,只有当您希望展平某些深度未知的嵌套数据结构时,才应该使用展平。但是有更好的方法来执行一级平坦化。