Hello Andreas!

Thanks for your swift reply. I'll try to explain the reasoning behind
my code.

In the Clojure Reference I found the function into, which is described
like so:

Usage: (into to from)
"Returns a new coll consisting of to-coll with all of the items of
from-coll conjoined."

I'm currently reading the book "Programming Clojure". In it, the
author has a chapter on binding which states that vectors are indeed
immutable. I'm not sure if this is a problem of scope, but I thought
that I could coerce fib-vec into receiving a new vec and throwing the
old one away (making the old one available for deletion from the GC).
That is why I used 'into fib-vec'. I thought it would re-bind fib-vec
to itself, but with one element less. I used the same idea with
ansVec.

Could you perhaps tell me why it cannot do that? Rather, is this
behavior possible in Clojure?

PS:  Thanks for the book-tipp! I'll be sure to check it out.

On Mar 20, 10:48 am, Andreas Kostler
<andreas.koestler.le...@gmail.com> wrote:
> Hi Christian,
> What you're trying to do is to build up a vector with the last element of the 
> vector being the answer to your problem:
> (last answer)
> => 4613732
> You're trying to use cons (conj) to build up that list.
>
> Now, your function below never terminates because you're:
> a) Not actually building up the ans-vec
> b) Not actually changing fib-vec to be closer to termination
>
> Clojure datastructures are immutable. conj returns a new seq with the second 
> argument conj(s)ed onto the old sequence without changing the old seq e.g.:
>
> (def v [1 2 3])
> (conj v 4)
> => [1 2 3 4]
>
> but:
> v
> => [1 2 3]
>
> The same applies to into.
> The closest I can think of you're trying to achieve is:
>
> (defn answer []
>         (loop [ans-vec [0] fib-v fib-vec]
>            (if (empty? fib-v)
>                ans-vec
>                (recur (conj ans-vec (+ (last ans-vec) (last fib-v))) (pop 
> fib-v)))))
>
> Now you're actually building up ans-vec in a tail-recursive fashion while 
> changing fib-v to be closer to termination.
>
> Having said that, what you really want is (reduce + fib-vec) ;)
>
> Andreas
> P.S. To get your head around basic recursion dig into "The little Schemer" by 
> Friedman and Felleisen
>
>  On 20/03/2011, at 7:22 PM, Christian wrote:
>
>
>
>
>
>
>
>
>
> > I've tried Project Euler 2 now.
>
> > For those unfamiliar, Project Euler Problem 2 states:  find the sum of
> > all even-valued fibonacci terms that are less than four million.
>
> > Let's assume that I have the code to fill the vector:
>
> > (def fib-seq
> >  ((fn rfib [a b]
> >     (lazy-seq (cons a (rfib b (+ a b)))))
> >   0 1))
>
> > (def fib-vec
> >  (into [] (filter even? (take 35 fib-seq))))
>
> > Many people reading the Clojure Samples will be familiar with the
> > first sample. My own implementation did not want the 'take' function
> > to work. However, that is a question for another day. Assume that the
> > magic number 35 in the second function does indeed give me all even-
> > valued fibonacci terms under four million. (I did not know how to
> > specify a predicate depending on the value of (fib-seq) to check if
> > the value is under 4 million.)
>
> > With the function '(reduce + (fib-vec))' I effortlessly summed up all
> > values in the vector. This is peculiar, because I first wanted to
> > write a function that does this for me, but to no avail.
>
> > (defn answer []
> >  (let [ansVec [0]]
> >  (while (not-empty fib-vec)
> >    (conj ansVec (+ (last ansVec) (last fib-vec)))
> >    (into fib-vec (pop fib-vec)))))
>
> > This function never terminates. Why not? Where am I thinking wrong?
>
> > --
> > 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
>
> ************www.leica-geosystems.com*************
>
> when it has to be right, Leica Geosystems
>
> Please  consider the environment before printing this email.

-- 
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

Reply via email to