【发布时间】:2015-09-18 00:11:03
【问题描述】:
我正在学习 Clojure,我正在使用 4Clojure 作为资源。我可以解决网站上的许多“简单”问题,但对我来说,以函数式编程思维方式思考仍然不是自然而然的(我来自 Java)。因此,我在大多数 seq 构建实现中都使用循环/递归迭代模式,因为这就是我习惯的思考方式。
但是,当我查看更有经验的 Clojure 用户的答案时,他们以更实用的方式做事。比如in a problem about implementing the range function,我的回答如下:
(fn [start limit]
(loop [x start y limit output '()]
(if (< x y)
(recur (inc x) y (conj output x))
(reverse output))))
虽然这行得通,但其他用户做了这样的事情:
(fn [x y] (take (- y x) (iterate inc x)))
我的函数更冗长,我什至不知道“迭代”函数存在。但从效率的角度来看,我的回答是否更糟?循环/重复使用是否比替代方案更糟糕?我担心这种事情将来会在我身上发生很多,因为还有很多我不知道的函数,比如迭代。
【问题讨论】:
-
如果您切换到使用向量而不是列表,则无需反转最终输出。 conj-ing 到一个向量上添加到末尾。试试
(conj '(0) 1)和(conj [0] 1)看看有什么不同。所以改成output [],把反面放在最后。
标签: clojure