You can reduce in one pass with a function that tracks both the sum
and the count.

(defn avg [coll]
  (apply / (reduce (fn [[sum n] x] [(+ sum x) (inc n)]) [0 0] coll)))

This reduce function is somewhat unusual in that its arguments have
different forms. As a result, this one does require the initial-value
argument be used. It's set to [0 0] indicating the sum and count both
start at 0. The function then "consumes" the numbers in coll one at a
time, producing the running sum and count each time. Then we just
apply / to divide the sum by the count.

On Mar 28, 9:18 pm, "simon.T" <simon.j....@gmail.com> wrote:
> The obvious way is like the following, which traverse the sequence 2 times.
> Wondering what will be the efficient way...
>
> (defn avg [coll]
>   (/ (reduce + coll) (count coll)))

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to