学习Clojure(和函数式编程)我偶然发现了将表示为嵌套java.util.ArrayList
的可变n元树转换为持久树的问题。
使用非函数式编程通常会创建从根到叶的树。使用持久性数据结构似乎不可能。
有人可以告诉我如何在给定可变n-ary树的情况下构造不可变树吗?
答案 0 :(得分:2)
与大多数功能一样,答案是递归。事实上,通过改变java中的一堆列表来实现功能性更加容易。您只需定义一个函数,将单个ArrayList转换为clojure列表,然后让该函数在任何子列表上递归调用。这是最简单的答案;如果你想支持地图而不是列表或其他什么,你可以添加多余的装饰。
(import '(java.util List ArrayList))
(defn lists->tree [x]
(if (instance? List x)
(map lists->tree x)
x))
(lists->tree (ArrayList. [(ArrayList. [1 2 3])
(ArrayList. [(ArrayList. [4 5])
(ArrayList. [6])])]))
((1 2 3) ((4 5) (6)))