Подтвердить что ты не робот

Clojure найти последний элемент без использования последней функции

Я изучаю clojure и использую 4clojure.com для улучшения. Я только что закончил # 19, но похоже, что, возможно, я не сделал этого совершенно так, как предполагал автор, - как будто я, возможно, пропустил точку как-то.

4 clojure problem 19

Учитывая ограничение, что вы не можете использовать последнюю функцию, это похоже на разумное решение?

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

Ответ 1

Это правильное решение. Я бы пошел с #(nth % (dec (count %))) как более идиоматичным, но функционально эквивалентным.

Ответ 2

Если вы собираетесь использовать:

#(first (reverse %))

Вы можете также создать функцию с помощью "comp":

(comp first reverse)

Это, вероятно, немного более идиоматично и легче читать. Здесь же оговорка о "обратном" обращении не ленится.

Ответ 3

Что насчет

reduce (fn [a b] b)

В пустом

Ответ 4

Здесь чисто рекурсивный подход, который не полагается на подсчет:

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

Ответ 5

Да, это разумное решение. Несколько вещей:

  • Более идиоматично использовать функцию dec вместо вычитания на единицу.

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

  • Следуйте за другими людьми на 4clojure. Таким образом вы сможете увидеть их решения проблемы после того, как вы ее решите. Я сам работаю через 4clojure и считаю очень полезным узнать язык, особенно определенные идиомы.

  • Первое решение, о котором я думал, было бы просто повернуть вспять список и взять первый элемент.

    #(first (reverse %))

Ответ 6

Я думаю, вы можете стать еще проще с чем-то вроде (comp peek vec). Я думаю, проблема заключается в том, что last работает с последовательностями и работает в линейном времени, как говорится в документации:

clojure.core/last ([coll]) Возвращает последний элемент в coll, в линейном время

peek, с другой стороны, быстрее, чем last в соответствии с документами:

clojure.core/peek ([coll]) Для списка или очереди, как и для первого, для вектор, такой же, как, но гораздо более эффективный, чем, последний. Если коллекция пуста, возвращает nil.

Ответ 7

Я не думаю, что мое решение лучше, чем кто-либо другой, но я думаю, что это другой способ решения одной и той же проблемы:

(fn 
  [x] 
  (nth x (- (count x) 1)))

Это используется fn.

Ответ 8

(fn getLast [l] (if (= (count l) 1) (first l) (getLast (rest l))) )