我遇到的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