Some functional languages have this convenience. They also usually implement tail call optimizations (convert functions to while loops). This is a helpful feature to have, since it allows easier renaming of functions and makes bugs a little bit more obvious. It’s also more readable.
; Clojure example (def factorial (fn [n] (loop [cnt n acc 1] (if (zero? cnt) acc (recur (dec cnt) (* acc cnt)) ; in loop cnt will take the value (dec cnt) ; and acc will take the value (* acc cnt) ))))