【发布时间】:2012-06-07 12:21:25
【问题描述】:
我正在尝试递归地反转列表,但在运行时得到Can only recur from tail position。这究竟意味着什么?如何改进我的代码以使其正常工作?
(defn recursive-reverse [coll]
(loop [coll coll]
(if (< (count coll) 2) '(coll)
(conj (first coll) (recur (rest coll)))
)))
编辑
Oscar 解决方案的输出。它适用于列表但不适用于向量?
user=> (= (recursive-reverse [1 2 3 4 5]) (recursive-reverse '(1 2 3 4 5)))
false
user=> (= '(1 2 3 4 5) [1 2 3 4 5])
true
user=> (recursive-reverse [1 2 3 4 5])
[1 2 3 4 5]
user=> (recursive-reverse '(1 2 3 4 5))
(5 4 3 2 1)
【问题讨论】:
-
它对列表和向量的工作方式不同,因为
conj对两者的工作方式不同。将项目“添加”到列表的前面和向量的末尾是最便宜的。conj查看集合的类型并以最便宜的方式添加它。老实说,这对我来说从来都不是很正确,但我确信 Rich Hickey 和其他 Clojure 开发人员已经对此进行了非常彻底的思考,并认为利大于弊。 -
令人着迷。我想性能是他们对基本操作的第一要义,但是是的,这似乎很奇怪。
-
看准了,@Gert。我更新了我的答案,如果输入是向量,我宁愿返回不同类型的正确答案而不是错误答案