Clojure now supports mutual recursive local functions using letfn
:
(defn ring [n]
(letfn [(a [n] (if (zero? n) n (b (dec n))))
(b [n] (if (zero? n) n (c (dec n))))
(c [n] (if (zero? n) n (a (dec n))))]
(c n)))
(ring 1000)
Using trampoline
, you can even make this stackless: