在clojure中双重递归

时间:2018-05-27 16:16:59

标签: clojure functional-programming mutual-recursion

我有一个clojure程序,其中两个函数递归地相互调用:

(defn f1
...
(f2 ...)
)


(defn f2
...
(f1 ...)
)

编译器在f1中发出错误。它说f2没有定义。有没有办法{* 1}}一个函数在clojure中。我可以验证递归实际终止。

2 个答案:

答案 0 :(得分:7)

字面意思declare

(declare f2)
(defn f1 []
  (f2))

(defn f2 []
  (f1))

答案 1 :(得分:2)

还有({可能)相互递归函数的letfn形式:

user=> (letfn [(f1 [x] (if (< x 10) (f2 x) x))
               (f2 [x] (f1 (inc x)))]
         (f2 0))

;;=> 10

<强>更新 如果您在全球范围内需要这些功能,则可以始终在def内使用letfn。至于我,我发现这种方法比declare更清晰(特别是对于相互递归的方法):

user> (letfn [(f1 [x] (if (< x 10) (f2 x) x))
              (f2 [x] (f1 (inc x)))]
        (def f1 f1)
        (def f2 f2))
#'user/f2

user> (f2 0)
;;=> 10