clojure在不使用last函数的情况下找到最后一个元素

时间:2011-11-25 04:43:14

标签: clojure

我正在学习clojure并且一直在使用4clojure.com来改善。我刚刚完成#19,但似乎我没有像作者所预料的那样完成它 - 就像我可能不知何故错过了这一点。

4 clojure problem 19

鉴于你不能使用最后一个函数的约束,这看起来像是一个合理的解决方案吗?

#(.get %(- (count %) 1))

8 个答案:

答案 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)

是的,这是一个合理的解决方案。但有一些事情:

  1. 使用函数dec而不是减去1是更惯用的。

    #(.get % (dec (count %)))

  2. 关注4clojure上的其他人。这样,您可以在解决问题后看到问题的解决方案。我自己在4clojure工作,发现学习语言非常有用,特别是某些习语。

  3. 我想到的第一个解决方案就是反转列表并采用第一个元素。

    #(first (reverse %))

答案 5 :(得分:2)

我认为你可以用(comp peek vec)之类的东西变得更简单。我认为问题在于last正在处理序列并且在线性时间内工作,如文档所述:

  

clojure.core / last([coll])以线性方式返回coll中的最后一项   时间

另一方面,根据文档,

peeklast更快:

  

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))) )