【发布时间】:2017-01-03 16:08:35
【问题描述】:
我编写了一个函数,它使用递归来查找列表中的元素数量,并且它可以成功运行,但是我并不特别喜欢我编写它的方式。现在我用一种我想不出的另一种方式来写它。
我的代码如下:
(def length
(fn [n]
(loop [i n total 0]
(cond (= 0 i) total
:t (recur (rest i)(inc total))))))
在我看来,它似乎过于复杂,谁能想到另一种可以写成比较的方式?
非常感谢任何帮助。
【问题讨论】:
-
为什么不直接使用clojuredocs.org/clojure.core/count?
-
我必须使用递归使它工作,这就是为什么我走上了使用循环的路线,以及为什么它最终变得如此复杂。递归使用 count 有意义吗?
-
使用
loop-recur你只有一个循环,而不是递归。 -
loop/recur 在概念上与递归函数相同——这就是为什么“recur”是名称的一部分。它在 JVM 上作为循环实现,但如果您将其移植到方案中,您将使用递归函数来实现它。
-
@amalloy,我认为应该指出该方案的标准要求 TailCall-Optimization,所以如果我没有弄错你的“作为递归函数的实现”,很可能会以循环,因此与通过关键字的显式尾调用相同(如
recuris)。 - 除了它是自动完成的