I tried your solution to #3 on my old windows laptop and trying to find the prime factors for 600851475143 gave a stack overflow. However, replacing the recursive calls with recur produced the correct result. I think this is because only one of the two branches that recurse is ever executed so tail-call optimisation is still possible in this case. If it was called twice (as in some implementations of the Fibonacci sequence) I'm guessing it would fail.
Comments
I tried your solution to #3 on my old windows laptop and trying to find the prime factors for 600851475143 gave a stack overflow. However, replacing the recursive calls with recur produced the correct result. I think this is because only one of the two branches that recurse is ever executed so tail-call optimisation is still possible in this case. If it was called twice (as in some implementations of the Fibonacci sequence) I'm guessing it would fail.
Sure makes sense. Any idea why clojure doesn't do automatic tail call optimization, and instead depends on recur?
The first reply at http://groups.google.com/group/clojure/browse_thread/thread/... goes into pretty good detail from the language designer.
The short version is that it's a limitation in the JVM currently that he's hoping is removed some day.