list - clojure 尾递归中的 java.lang.StackOverflowError

标签 list loops clojure stack-overflow reverse

我遇到了以下代码的 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/

相关文章:

list - 如何使用 List.map 实现 List.allPairs?

logging - 如何使用 core.async 在 Clojure 中写入日志文件?

android - 哪些语言在Android中开发原生应用比较成熟[Java除外]

javascript - "convert foo to bar"的函数名称约定

java - 对包含自定义类的列表进行排序

python - 如何将一个列表中的值与Python列表字典中的唯一值相匹配

Jquery 处理返回的数据

loops - 一行用元组循环函数调用的结果 (results, err)

list - 在 F# 中应用 Fold 函数

mysql - 在现有表中插入 13000 行