thanks for your patience. I think I'm starting to get it. Interesting discussion on tail recursion. Add a lot of depth to what Rich was talking about. Really smart work-around!
On Jan 11, 2:50 pm, James Reeves <weavejes...@googlemail.com> wrote: > On Jan 11, 7:19 pm, e <evier...@gmail.com> wrote: > > > oh. I missed the "recur my-list" in your answer. So we still don't > > have an iterative solution. Recursion should never be necessary. I > > agree that it simplifies things sometimes and you can use it when you > > are stuck. . . . .but no need to push a whole stack frame for such a > > simple problem, I would posit. > > Actually, that's the nice thing about loop/recur: it looks recursive > but is actually iterative. > > So a recursive function like this: > > (defn sum [total list] > (if list > (sum (+ total (first list)) > (rest list)) > total)) > > Can be turned into an iterative one via recur: > > (defn sum [total list] > (if list > (recur (+ total (first list)) > (rest list)) > total)) > > Note that if there is no matching loop construct, it uses the > containing function instead. > > Most functional languages actually optimize functions like the one > above automatically, without a need for an explicit recur. It's called > tail call optimization; if a function calls itself last of all, > there's no need to keep the stack around. Unfortunately, the JVM > doesn't have this capability, so we need to explicitly tell Clojure to > do it via recur. > > Note that for recur to work, it needs to be the last thing called. So > a more naive implementation of sum wouldn't be able to use recur: > > (defn sum [list] > (if list > (+ (first list) (sum (rest list))) > 0)) > > In this case, the last function called is +, so you can't substitute > "sum" for "recur" in this case. > > - James --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---