我遇到的StackOverflowError以下代码:java.lang.StackOverflowError的Clojure中尾递归
(defn recursive-reverse
([coll] (recursive-reverse [coll nil]))
([coll acc]
(if (= coll '()) acc
(recur (rest coll) (cons (first coll) acc)))))
虽然使用循环会使其工作:
(defn recursive-reverse [lst]
(loop [coll lst acc nil]
(if (= coll '()) acc
(recur (rest coll) (cons (first coll) acc)))))
错在现有代码没有循环?
谢谢。现在清澈透明。 – lkahtz 2011-12-22 01:08:40
'(nil?x)'可能比'(= x())'快得多,因为编译器只能发出一个字节码操作,即Java使用的原始空值检查。当然,后者非常快,但我怀疑它比前者慢好几倍。碰巧,这个优化的无检查没有实现(但?),但这是一个合理的优化,最终可能会做出。 – amalloy 2011-12-22 02:05:57