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