Как я могу найти индекс самого маленького члена этого вектора в Clojure?
Вопрос
Я использовал следующее выражение, чтобы получить индекс наименьшего числа в векторе. Однако я хотел бы избежать использования .indexOf
(По причинам эффективности и, возможно, числовой точностью, хотя я думаю, что цифры неявно преобразуются в строки).
(.indexOf [1 2 3 4 0 5]
(reduce #(if (< %1 %2) %1 %2) [1 2 3 4 0 5] ))
Можно ли сделать это по -другому, используя уменьшение?
Решение
user=> (first (apply min-key second (map-indexed vector [1 2 4 0 5]))) 3
Другие советы
Я бы посоветовал использовать цикл/Recur, если вы хотите сделать это эффективно, возможно, что -то вроде следующего:
(defn min-index [v]
(let [length (count v)]
(loop [minimum (v 0)
min-index 0
i 1]
(if (< i length)
(let [value (v i)]
(if (< value minimum)
(recur value i (inc i))
(recur minimum min-index (inc i))))
min-index))))
Идея состоит в том, чтобы итерация по всему вектору, отслеживая минимум и индекс минимального значения, найденного до сих пор в каждой точке.
Не связан с StackOverflow