为了回答关于SO的问题,我正在构建一个循环函数,并构建了我迄今为止最复杂的结构,这奇迹般地起作用了:
(defn fib?
[a b & [c & r]]
(if (= c (+ a b))
(if r
(recur b c r)
true)
false))
(fib? 0 1 1)
=> true
(fib? 2 3 5 8 13)
=> true
但是我不知道为什么它应该起作用。
r
中使用的recur
是一个集合,这会使原始功能失败。(fib? 2 3 [5 8 13])
=> false
我想在那里使用类似
apply recur
的方法,但是由于recur
是一种特殊的形式,所以这是不可能的。所以我尝试了没有它,它起作用了。 recur
是否具有神奇的自动应用属性,或者还有其他我没有看到的东西。 最佳答案
答案分为两部分:
recur
形式的最终参数。在这一点上,它不再是特别的。通常,您需要确保在该位置传递的所有值实际上都是顺序的,但即使不强制执行。1fn
和let
宏提供的语法糖。在其参数 vector 中使用解构的fn
格式的简化版本采用一定数量的常规参数,然后以包围整个主体的let
格式对其进行解构。因此,如果您返回到在参数 vector 中使用解构的函数的顶部,则新值将在下一次迭代时被解构。 1例如,
((fn [& xs] (if (seq? xs) (recur (first xs)) xs)) 1 2 3)
返回1
。