2012-01-11 22 views
5

Tôi đã sử dụng biểu thức sau để lấy chỉ mục của số nhỏ nhất trong một vectơ. Tuy nhiên, tôi muốn tránh việc sử dụng .indexOf (vì lý do hiệu quả và có thể chính xác về số, mặc dù tôi đoán các con số được chuyển đổi hoàn toàn thành chuỗi).Làm cách nào tôi có thể tìm thấy chỉ mục của thành viên nhỏ nhất của vectơ này trong Clojure?

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

Bạn có thể làm điều đó khác đi bằng cách giảm bớt không?

Trả lời

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

Có thể hơi đơn giản hóa bằng cách sử dụng http://clojuredocs.org/clojure_contrib/clojure.contrib.seq-utils/indexed – opqdonut

+0

Lưu ý rằng tôi không cho rằng nhận xét ở trên là đúng nữa - chức năng 'được lập chỉ mục' sẽ không xuất hiện để tồn tại trong Clojure 1.3. – candrews

4

tôi muốn đề nghị sử dụng vòng lặp/tái diễn nếu bạn muốn làm điều này một cách hiệu quả, có lẽ giống như sau:

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

Ý tưởng là để lặp trên toàn bộ vector, theo dõi các tối thiểu và chỉ số giá trị tối thiểu được tìm thấy cho đến nay tại mỗi điểm.

Các vấn đề liên quan