我今天一直在解决4Clojure上的问题,但在问题 28上遇到了麻烦,实现了 flatten。
我的代码有几个明确的问题。
(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)))
我可以就如何思考几个问题提出一些建议。
如何确保我没有更改结果列表的顺序?
cons
并且conj
两者都在添加元素最有效的地方添加元素(在列表的开头,在向量的末尾等),所以我看不出在使用泛型时我应该如何控制它序列。如何处理不同类型的嵌套序列?例如, will 的输入
'(1 2 [3 4])
将输出([3 4] 2 1)
,而 will 的输入[1 2 '(3 4)]
将输出(4 3 2 1)
我什至是从“正确”的角度来解决这个问题吗?我应该使用带有累加器的递归内部函数来做到这一点,还是我错过了一些明显的东西?