Counting ways to form an amount using coins
How about something like this:

(defn shift-vector
  "Shifts v one to the left, insert shift-val at the right"
  [v shift-val]
  (conj (subvec v 1) shift-val))

(defn update-in-all
  "Updates ks in m with f applied for each value at k."
  [m ks f]
  (reduce (fn [m' k] (update-in m' [k] f)) m ks))

(defn fast-iterative-coinstacks
  "Returns the number of ways to form a coin stack with a total
  value of n with coins"
  [n coins]
  (let [max-coin (reduce max coins)
        initial-stacks (into [1] (repeat max-coin 0))
        process-stacks (fn [stacks]
                         (-&gt; stacks
                             (update-in-all coins (partial + (first stacks)))
                             (shift-vector 0)))]
    (-&gt; (iterate process-stacks initial-stacks)
        (nth n)
        first)))


Some explanations:


update-in works both with vectors and maps, and can update nested values as well,
the threading macro -&gt; makes the flow of your code easier to follow,
iterate is a really convenient function that given f and x returns a lazy sequence of x, (f x), (f (f x))...
you can do a lot of things with reduce!