2012-01-11 16 views
5

He utilizado la siguiente expresión para recuperar el índice del número más pequeño en un vector. Sin embargo, me gustaría evitar el uso de .indexOf (por razones de eficiencia y tal vez de precisión numérica, aunque supongo que los números se convierten implícitamente en cadenas).¿Cómo puedo encontrar el índice del miembro más pequeño de este vector en Clojure?

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

¿Sería posible hacerlo de otra manera usando reducir?

Respuesta

13
 
user=> (first (apply min-key second (map-indexed vector [1 2 4 0 5]))) 
3 
+0

Puede simplificarse ligeramente utilizando http://clojuredocs.org/clojure_contrib/clojure.contrib.seq-utils/indexed – opqdonut

+0

Tenga en cuenta que no creo que el comentario anterior sea verdadero: la función 'indexada' no aparece para existir en Clojure 1.3 en. – candrews

4

me gustaría sugerir el uso de bucle/reaparecer si usted quiere hacer esto de manera eficiente, tal vez algo como lo siguiente:

(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)))) 

La idea es iterar a través de todo el vector, hacer el seguimiento de la mínimo y el índice del valor mínimo encontrado hasta ahora en cada punto.

Cuestiones relacionadas