gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:56:03 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com