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

jav*_*y79 24 clojure

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

4 clojure问题19

鉴于您不能使用最后一个函数的约束,这似乎是一个合理的解决方案吗?

#(.get %(- (count %) 1))
Run Code Online (Sandbox Code Playgroud)

小智 41

如果您打算使用:

#(first (reverse %))
Run Code Online (Sandbox Code Playgroud)

你也可以用"comp"组成函数:

(comp first reverse)
Run Code Online (Sandbox Code Playgroud)

这可能是一个更惯用,更容易阅读.关于"反向"不懒惰的相同警告适用于此.

  • 打赌他们希望用户写这个答案,而不是奇怪的[length-1] (3认同)

man*_*nge 26

这是一个有效的解决方案.我会#(nth % (dec (count %)))更喜欢惯用,但它们在功能上是等同的.

  • 请说明为什么它更"惯用".它将帮助Clojure学生:-) (2认同)

Ank*_*kur 21

关于什么

reduce (fn [a b] b)
Run Code Online (Sandbox Code Playgroud)

在空白处


Ale*_*art 18

这是一种纯粹的递归方法,不依赖于计数:

(defn end [[n & more]]
  (if more
    (recur more)
    n))

  • 这不是4clojure网站上可接受的解决方案 (2认同)

Sea*_*lan 8

是的,这是一个合理的解决方案.但有几点:

  1. 使用该函数dec而不是减去一个函数更加惯用.

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

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

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

    #(first (reverse %))

  • 公平地说,`count/nth`解决方案和`reverse`解决方案一样非懒惰:两者都会在非常大的输入序列上失败.可悲的是,@ ivant,懒惰序列的懒惰反转是不可能的. (5认同)