Which Function is the best in terms of Stack Usage Efficiency and Time
clojure, functional-programming, lisp
Solution
The loop/recur version is the right way. Clojure cannot optimize tail calls due to limitations of the JVM.
Problem
I wrote 3 functions that count the number of times an-element appears in a-list. I tried various inputs and profiled it but I still dont know which function is the best in terms of stack usage efficiency and time efficiency. Please Help me out. ``` ;; Using an accumulator (defn count-instances1 [a-list an-element] (letfn [(count-aux [list-aux acc] (cond (empty? list-aux) acc :else (if (= (first list-aux) an-element) (count-aux (rest list-aux) (inc acc)) (count-aux (rest list-aux) acc))))] (count-aux a-list 0))) ;; Normal counting (defn count-instances2 [a-list an-element] (cond (empty? a-list) 0 :else (if (= (first a-list) an-element ) (+ 1 (count-instances2 (rest a-list) an-element)) (count-instances2 (rest a-list) an-element)))) ;; using loop. does this help at all? (defn count-instances3 [a-list an-element] (loop [mylist a-list acount 0] (if (empty? mylist) acount (if (= (first mylist) an-element) (recur (rest mylist)(inc acount)) (recur (rest mylist) acount))))) ```