扁平化一个序列,但是不允许使用flatten
Write a function which flattens a sequence.
直接参考了clojure的flatten 函数的代码
((fn [x]
(filter (complement sequential?)
(rest (tree-seq sequential? seq x)))
) '((1 2) 3 [4 [5 6]]))
=> (1 2 3 4 5 6)
首先是调用tree-seq 获得目标序列的先根深度优先遍历的情况
第一个参数sequential?是在递归过程中用来判断节点是否有子节点
第二个参数seq 用来在递归过程中获得一个节点的子节点
第三个参数 x 为目标序列
测试tree-seq
(tree-seq sequential? seq [1 2 3 [4 5 6 [7 8 9]]])
=> ([1 2 3 [4 5 6 [7 8 9]]] 1 2 3 [4 5 6 [7 8 9]] 4 5 6 [7 8 9] 7 8 9)
我们发现tree遍历出来的每个数据都是一颗完整的树
最后用filter把tree-seq返回的结果里面单节点的元素过滤出来就是结果