我遇到了以下代码的 StackOverflowError:
(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)))))
没有循环的先前代码出了什么问题?
最佳答案
你的错误在这里:
([coll] (recursive-reverse [coll nil]))
您调用
recursive-reverse
有一个参数(一个向量)。这调用了函数的相同参数列表,因此它递归地执行它并每次创建一个堆栈帧。将其更改为:
([coll] (recursive-reverse coll nil))
你应该是对的。
(另外,单独的问题,但我通常会检查
nil
而不是 '()
并使用 next
而不是 rest
。我认为它在性能或其他方面没有任何真正的优势,但是对我来说似乎更干净。)
关于list - clojure 尾递归中的 java.lang.StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8598193/