Re: easy sum of squares refactor question
Glad I could help! SICP is a wonderful book, and Clojure is a dream come true in that it gives you a step from SICP into the real world. Clojure would be just about perfect if it had general tail call optimization and continuations, but I don't really miss those so far (in any case they can't really be added until the JVM supports them). And the seq abstraction and readable data structures are such a huge plus I'd never go back to Scheme. I remember getting frustrated with those exact two deficiencies when using Scheme, and wanting to have a language that fixed that; along came Clojure. Clojure is also constantly improving and getting more polished, and moving into more and more fields of use. On Oct 31, 10:06 am, Aquahappy wrote: > Thanks so much for your help!!! I'm so glad you had the time to > respond to my newbie question. > > And as if you read my mind as I was going through the SICP lecture and > referencing chapter two in Manning's Joy of Clojure book I was > wondering how to turn this explicit recursive call taken from the > scheme example into a Clojure non-tail recursion using 'recur'. I had > been unsuccessful in my trials, so thank you times two!!! > > I'm off to try this out in my REPL! > > Many bows, > Joshua > > On Oct 30, 11:29 pm, nchurch wrote: > > > > > > > > > Another solution, this time using Clojure's tail recursion: > > > (defn sum2 [func incr a b] > > (loop [accum 0 > > x a] > > (if (> x b) > > accum > > (recur (+ (func x) accum) (incr x) > > > This may be getting ahead of where you are now, so come back and look > > when you've covered map, reduce, and tail recursion! -- 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 Note that posts from new members are moderated - please be patient with your first post. 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
Re: easy sum of squares refactor question
Thanks so much for your help!!! I'm so glad you had the time to respond to my newbie question. And as if you read my mind as I was going through the SICP lecture and referencing chapter two in Manning's Joy of Clojure book I was wondering how to turn this explicit recursive call taken from the scheme example into a Clojure non-tail recursion using 'recur'. I had been unsuccessful in my trials, so thank you times two!!! I'm off to try this out in my REPL! Many bows, Joshua On Oct 30, 11:29 pm, nchurch wrote: > Another solution, this time using Clojure's tail recursion: > > (defn sum2 [func incr a b] > (loop [accum 0 > x a] > (if (> x b) > accum > (recur (+ (func x) accum) (incr x) > > This may be getting ahead of where you are now, so come back and look > when you've covered map, reduce, and tail recursion! -- 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 Note that posts from new members are moderated - please be patient with your first post. 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
Re: easy sum of squares refactor question
Another solution, this time using Clojure's tail recursion: (defn sum2 [func incr a b] (loop [accum 0 x a] (if (> x b) accum (recur (+ (func x) accum) (incr x) This may be getting ahead of where you are now, so come back and look when you've covered map, reduce, and tail recursion! -- 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 Note that posts from new members are moderated - please be patient with your first post. 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
Re: easy sum of squares refactor question
All you have to do is abstract the function you want (by 'abstract' I mean "put it in the argument list and replace the function with the variable"): (defn sum2 [func incr a b] (if (> a b) 0 (+ (fn a) (sum2 func incr (incr a) b You wouldn't want to use this code in the real world since it involves non-tail recursionsomething more idiomatic would be like this: (defn sum3 [func incr a b] (if (> a b) 0 (reduce + (map func (take-while #(<= % b) (iterate incr a)) I admit this is not as elegant-looking; recursive functions are nearly always more elegant! Note I've used the short form for anonymous functions; I could have written (fn[x] (<= x 3)) instead, but the short form is preferable for inline functions. (You need to rename your function var to something other than 'fn', since that is a Clojure keyword.) On Oct 30, 6:48 pm, Aquahappy wrote: > Hi All, > > I'm watching Brian Harvey's SICP lecture #3 from Berkeley 61A/Spring > 2011 and had a question about how I could refactor the following > function so that the (+a 1) can be abstracted to be a function and > passed in. > > Here is the original: > > (defn square [x] (* x x)) > > (defn sum [fn a b] > (if (> a b) > 0 > (+ (fn a) (sum fn (+ a 1) b > > => (sum square 2 4) > 29 > > That works. So then I want to replace (+ a 1) with a function like: > > (defn addone [a] (inc a)) > > but I'm not sure how this would be structured. > > I'm new to clojure and realize this is a stepping stone to learning > about higher order functions so apologies in advance for any code > ugliness due to my newness to clojure. > > Thanks for your help!!! -- 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 Note that posts from new members are moderated - please be patient with your first post. 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
easy sum of squares refactor question
Hi All, I'm watching Brian Harvey's SICP lecture #3 from Berkeley 61A/Spring 2011 and had a question about how I could refactor the following function so that the (+a 1) can be abstracted to be a function and passed in. Here is the original: (defn square [x] (* x x)) (defn sum [fn a b] (if (> a b) 0 (+ (fn a) (sum fn (+ a 1) b => (sum square 2 4) 29 That works. So then I want to replace (+ a 1) with a function like: (defn addone [a] (inc a)) but I'm not sure how this would be structured. I'm new to clojure and realize this is a stepping stone to learning about higher order functions so apologies in advance for any code ugliness due to my newness to clojure. Thanks for your help!!! -- 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 Note that posts from new members are moderated - please be patient with your first post. 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