我正在学习clojure并且一直在使用4clojure.com来改善。我刚刚完成#19,但似乎我没有像作者所预料的那样完成它 - 就像我可能不知何故错过了这一点。
鉴于你不能使用最后一个函数的约束,这看起来像是一个合理的解决方案吗?
#(.get %(- (count %) 1))
答案 0 :(得分:41)
如果您打算使用:
#(first (reverse %))
您也可以使用“comp”组成函数:
(comp first reverse)
这可能更具惯用性,更易于阅读。关于“反向”而不是懒惰的相同警告适用于此。
答案 1 :(得分:26)
这是一个有效的解决方案。我会选择#(nth % (dec (count %)))
作为更惯用的,但它们在功能上是相同的。
答案 2 :(得分:21)
怎么样?
reduce (fn [a b] b)
空白
答案 3 :(得分:18)
这是一种纯粹的递归方法,不依赖于计数:
(defn end [[n & more]] (if more (recur more) n))
答案 4 :(得分:8)
是的,这是一个合理的解决方案。但有一些事情:
使用函数dec
而不是减去1是更惯用的。
#(.get % (dec (count %)))
关注4clojure上的其他人。这样,您可以在解决问题后看到问题的解决方案。我自己在4clojure工作,发现学习语言非常有用,特别是某些习语。
我想到的第一个解决方案就是反转列表并采用第一个元素。
#(first (reverse %))
答案 5 :(得分:2)
我认为你可以用(comp peek vec)
之类的东西变得更简单。我认为问题在于last
正在处理序列并且在线性时间内工作,如文档所述:
另一方面,根据文档,clojure.core / last([coll])以线性方式返回coll中的最后一项 时间
peek
比last
更快:
clojure.core / peek([coll])对于列表或队列,与第一个相同,对于a 矢量,与之相同,但效率更高。如果 集合是空的,返回nil。
答案 6 :(得分:1)
我认为我的解决方案比其他任何人都好,但我认为这是解决同一问题的另一种方法:
(fn
[x]
(nth x (- (count x) 1)))
这是使用fn
。
答案 7 :(得分:-1)
(fn getLast [l] (if (= (count l) 1) (first l) (getLast (rest l))) )