Tail Recursive List Design Pattern
(defn fnb [lst answer]
(if (empty? lst) ; test for base case
answer ; answer for base case
(fnb (rest lst)
(some-combination-of
answer
(something-about (first lst)))) ) )
(defn fn [lst] (fnb lst answerinit))
A smart compiler can detect a tail-recursive function and compile it so that it is iterative and uses O(1) stack space; this is called tail-call optimization. Unfortunately, Java and thus Clojure are not this smart.