Carlos, I think this is pretty much what you had in mind: (defn count-zeros [l] (cond (empty? l) 0 (zero? (first l)) (inc (count-zeros (rest l))) :else (count-zeros (rest l))))
(count-zeros '(9 8 6 0 1 2 0 5)) => 2 (count-zeros '(9 8 6)) => 0 (count-zeros '()) => 0 Of course the above version is not tail-recursive. However, once you're written a straightforward recursive function it is often easy to see how to rewrite it (using an accumulator here) to take advantage of Clojure's recur: (declare count-zeros-aux) (defn count-zeros [l] (count-zeros-aux l 0)) (defn- count-zeros-aux [l result] (cond (empty? l) result (zero? (first l)) (recur (rest l) (inc result)) :else (recur (rest l) result))) Here the base function presents the same interface to the user, and the private auxiliary function takes an additional accumulator argument. You could accomplish pretty much the same thing by defining two versions with different arities: (defn count-zeros ([l] (count-zeros l 0)) ([l result] (cond (empty? l) result (zero? (first l)) (recur (rest l) (inc result)) :else (recur (rest l) result)))) Or you could simplify things by using loop: (defn count-zeros [l] (loop [num-list l result 0] (cond (empty? num-list) result (zero? (first num-list)) (recur (rest num-list) (inc result)) :else (recur (rest num-list) result)))) Have all good days, David Sletten On Aug 9, 2010, at 8:24 PM, Carlos Torres wrote: > Hi to everyone, > > I'm trying to create a function that takes a simple list and returns the > number of zeros in the list. > So I'm assuming that they will enter a list containing only numbers. > This is what I have so far, but it only works when the list empty. Can > somebody tell me what I'm missing? > > (defn count-zeros > "Returns the numbers of zero in a simple sequence of numbers" > [list1] > (cond > (empty? list1) 0 > (not (zero? (first list1))) 0 > :else > (recur (+ 1 (count-zeros (rest list1)))))) > > --Carlos > > -- > 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 -- 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