Come posso trovare l'indice del più piccolo membro di questo vettore in Clojure?
Domanda
ho usato la seguente espressione per recuperare l'indice del numero più piccolo in un vettore. Tuttavia, vorrei evitare l'uso di .indexOf
(per ragioni di efficienza e precisione forse numerica, anche se credo che i numeri sono implicitamente convertiti in stringhe).
(.indexOf [1 2 3 4 0 5]
(reduce #(if (< %1 %2) %1 %2) [1 2 3 4 0 5] ))
sarebbe possibile farlo in modo diverso usando ridurre?
Soluzione
user=> (first (apply min-key second (map-indexed vector [1 2 4 0 5]))) 3
Altri suggerimenti
Io suggerirei usando loop / RECUR se si vuole fare questo in modo efficace, forse qualcosa di simile al seguente:
(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))))
L'idea è di iterate attraverso l'intero vettore, tenere traccia del minimo e l'indice del valore minimo trovato finora in ogni punto.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow