Bre*_*rto 3 functional-programming clojure
我今天一直在研究4Clojure的问题,我在问题28上遇到了麻烦,实现了扁平化.
我的代码存在一些明确的问题.
(fn [coll]
((fn flt [coll res]
(if (empty? coll)
res
(if (seq? (first coll))
(flt (into (first coll) (rest coll)) res)
(flt (rest coll) (cons (first coll) res))))) coll (empty coll)))
Run Code Online (Sandbox Code Playgroud)
我可以用一些关于如何思考几个问题的指针.
如何确保我不更改结果列表的顺序?cons
并且conj
两者都在添加元素的地方添加元素(在列表的开头,向量的末尾等),所以我看不出在使用泛型时我应该如何控制它序列.
如何处理不同类型的嵌套序列?例如,'(1 2 [3 4])
输出将输出([3 4] 2 1)
,而输入[1 2 '(3 4)]
将输出(4 3 2 1)
我是否从"正确"角度接近这个?我应该使用带累加器的递归内部函数来执行此操作,还是我错过了一些明显的东西?
您应该尝试尽可能多地使用HOF(更高阶函数):它可以更清楚地传达您的意图,并使您免于引入微妙的低级错误.
(defn flatten [coll]
(if (sequential? coll)
(mapcat flatten coll)
(list coll)))
Run Code Online (Sandbox Code Playgroud)