4clojure 题解 Flatten a Sequence

作者: admin 日期: 2017-12-28 10:47:20 人气: - 评论: 0

扁平化一个序列,但是不允许使用flatten

Write a function which flattens a sequence.

test not run
(= (__ '((1 2) 3 [4 [5 6]])) '(1 2 3 4 5 6))
test not run
(= (__ ["a" ["b"] "c"]) '("a" "b" "c"))
test not run
(= (__ '((((:a))))) '(:a))










直接参考了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返回的结果里面单节点的元素过滤出来就是结果

相关内容

发表评论
更多 网友评论0 条评论)
暂无评论

Copyright © 2012-2014 我的代码板 Inc. 保留所有权利。

页面耗时0.0280秒, 内存占用1.83 MB, 访问数据库13次

闽ICP备15009223号-1