Clojureのこのベクトルの最小メンバーのインデックスを見つけるにはどうすればよいですか?
質問
次の式を使用して、ベクトル内の最小数のインデックスを取得しました。しかし、私はの使用を避けたいです .indexOf
(効率的な理由と数値精度のために、数字は暗黙的に文字列に変換されていると思います)。
(.indexOf [1 2 3 4 0 5]
(reduce #(if (< %1 %2) %1 %2) [1 2 3 4 0 5] ))
Reduceを使用して異なる方法で行うことは可能でしょうか?
解決
user=> (first (apply min-key second (map-indexed vector [1 2 4 0 5]))) 3
他のヒント
これを効率的に行いたい場合は、ループ/再発を使用することをお勧めします。おそらく次のようなものです。
(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))))
アイデアは、ベクトル全体を繰り返し、各ポイントでこれまで見られる最小値と最小値のインデックスを追跡することです。
所属していません StackOverflow