Re: easy sum of squares refactor question

2011-10-31 Thread nchurch
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

2011-10-31 Thread Aquahappy
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

2011-10-30 Thread nchurch
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

2011-10-30 Thread nchurch
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

2011-10-30 Thread Aquahappy
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