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 [email protected]
> Note that posts from new members are moderated - please be patient with your
> first post.
> To unsubscribe from this group, send email to
> [email protected]
> 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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en