为了回答关于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是否具有神奇的自动应用属性,或者还有其他我没有看到的东西。

最佳答案

答案分为两部分:

  • 可变参数函数的“rest”参数成为递归到函数顶部的所有recur形式的最终参数。在这一点上,它不再是特别的。通常,您需要确保在该位置传递的所有值实际上都是顺序的,但即使不强制执行。1
  • 解构只是fnlet宏提供的语法糖。在其参数 vector 中使用解构的fn格式的简化版本采用一定数量的常规参数,然后以包围整个主体的let格式对其进行解构。因此,如果您返回到在参数 vector 中使用解构的函数的顶部,则新值将在下一次迭代时被解构。


  • 1例如,((fn [& xs] (if (seq? xs) (recur (first xs)) xs)) 1 2 3)返回1

    09-25 22:15