Ответ 1
Это правильное решение. Я бы пошел с #(nth % (dec (count %)))
как более идиоматичным, но функционально эквивалентным.
Я изучаю clojure и использую 4clojure.com для улучшения. Я только что закончил # 19, но похоже, что, возможно, я не сделал этого совершенно так, как предполагал автор, - как будто я, возможно, пропустил точку как-то.
Учитывая ограничение, что вы не можете использовать последнюю функцию, это похоже на разумное решение?
#(.get %(- (count %) 1))
Это правильное решение. Я бы пошел с #(nth % (dec (count %)))
как более идиоматичным, но функционально эквивалентным.
Если вы собираетесь использовать:
#(first (reverse %))
Вы можете также создать функцию с помощью "comp":
(comp first reverse)
Это, вероятно, немного более идиоматично и легче читать. Здесь же оговорка о "обратном" обращении не ленится.
Что насчет
reduce (fn [a b] b)
В пустом
Здесь чисто рекурсивный подход, который не полагается на подсчет:
(defn end [[n & more]] (if more (recur more) n))
Да, это разумное решение. Несколько вещей:
Более идиоматично использовать функцию dec
вместо вычитания на единицу.
#(.get % (dec (count %)))
Следуйте за другими людьми на 4clojure. Таким образом вы сможете увидеть их решения проблемы после того, как вы ее решите. Я сам работаю через 4clojure и считаю очень полезным узнать язык, особенно определенные идиомы.
Первое решение, о котором я думал, было бы просто повернуть вспять список и взять первый элемент.
#(first (reverse %))
Я думаю, вы можете стать еще проще с чем-то вроде (comp peek vec)
. Я думаю, проблема заключается в том, что last
работает с последовательностями и работает в линейном времени, как говорится в документации:
clojure.core/last ([coll]) Возвращает последний элемент в coll, в линейном время
peek
, с другой стороны, быстрее, чем last
в соответствии с документами:
clojure.core/peek ([coll]) Для списка или очереди, как и для первого, для вектор, такой же, как, но гораздо более эффективный, чем, последний. Если коллекция пуста, возвращает nil.
Я не думаю, что мое решение лучше, чем кто-либо другой, но я думаю, что это другой способ решения одной и той же проблемы:
(fn
[x]
(nth x (- (count x) 1)))
Это используется fn
.
(fn getLast [l] (if (= (count l) 1) (first l) (getLast (rest l))) )