Как я могу найти индекс самого маленького члена этого вектора в Clojure?

StackOverflow https://stackoverflow.com/questions/8815772

  •  26-10-2019
  •  | 
  •  

Вопрос

Я использовал следующее выражение, чтобы получить индекс наименьшего числа в векторе. Однако я хотел бы избежать использования .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))))

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top