Как найти индекс наименьшего члена этого вектора в Clojure? - PullRequest
5 голосов
/ 11 января 2012

Я использовал следующее выражение для получения индекса наименьшего числа в векторе. Однако я хотел бы избежать использования .indexOf (по соображениям эффективности и, возможно, числовой точности, хотя я предполагаю, что числа неявно преобразуются в строки).

(.indexOf [1 2 3 4 0 5]
  (reduce #(if (< %1 %2) %1 %2) [1 2 3 4 0 5] ))

Можно ли сделать это по-другому, используя Reduce?

Ответы [ 2 ]

14 голосов
/ 11 января 2012
user=> (first (apply min-key second (map-indexed vector [1 2 4 0 5])))
3
4 голосов
/ 11 января 2012

Я бы предложил использовать loop / 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))))

Идея состоит в том, чтобы выполнить итерацию по всему вектору, отслеживая минимум и индекс минимального значения, найденного до сих пор в каждой точке.

...