(defn to-percentage [wins total]
(if (= wins 0) 0
(* (/ wins total) 100)))
(defn calc-winrate [matches]
(let [data (r/atom [])]
(loop [wins 0
total 0]
(if (= total (count matches))
@data
(recur (if (= (get (nth matches total) :result) 1)
(inc wins))
(do
(swap! data conj (to-percentage wins total))
(inc total)))))))
(calc-winrate [{:result 0} {:result 1} {:result 0} {:result 1} {:result 1}])
Я получил следующий код, calc-winrate
в последней строке возвращает [0 0 50 0 25]
.Я пытаюсь заставить его вернуться [0 50 33.33333333333333 50 60]
.
Я делаю приращение для wins
неправильно?Когда я печатаю значение wins
для каждой итерации, я получаю
0
nil
1
nil
1
, поэтому я предполагаю, что я как-то сбрасываю или nil wins
как-то?
Кроме того, можно ли заменить весь этот цикл на map / map-indexed или что-то в этом роде?Такое ощущение, что карта была бы идеальной для использования, но мне нужно помнить о победах и итогах предыдущей итерации для каждой итерации.
Спасибо!