2012-01-11 8 views
5

Ho usato la seguente espressione per recuperare l'indice del numero più piccolo in un vettore. Tuttavia, vorrei evitare l'uso di .indexOf (per motivi di efficienza e forse di precisione numerica, anche se suppongo che i numeri siano convertiti implicitamente in stringhe).Come posso trovare l'indice del membro più piccolo di questo vettore in Clojure?

(.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 utilizzando Riduci?

risposta

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

Può essere un po 'semplificato utilizzando http://clojuredocs.org/clojure_contrib/clojure.contrib.seq-utils/indexed – opqdonut

+0

Si noti che non credo che il commento di cui sopra è più vero - la funzione 'indicizzata' non compare esistere in Clojure 1.3 su. – candrews

4

Io suggerirei usando loop/ripresentarsi 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 è quella di iterare su tutto il vettore, tenere traccia del minimo e l'indice del valore minimo trovato finora in ogni punto.

Problemi correlati