整数のリストがあるとしましょう:1, 2, 5, 13, 6, 5, 7
そして、繰り返される最初の数値を見つけて、2 つのインデックスのベクトルを返したいとします。私のサンプルでは、5 at[2, 5]
です。私がこれまでに行ったことはloop
ですが、もっとエレガントに、手短にできるでしょうか?
(defn get-cycle
[xs]
(loop [[x & xs_rest] xs, indices {}, i 0]
(if (nil? x)
[0 i] ; Sequence is over before we found a duplicate.
(if-let [x_index (indices x)]
[x_index i]
(recur xs_rest (assoc indices x i) (inc i))))))
番号自体を返す必要はありません。インデックスで取得できるためです。次に、常にそこにあるとは限りません。