Двойная рекурсия в clojure - PullRequest
0 голосов
/ 27 мая 2018

У меня есть программа clojure, в которой две функции рекурсивно вызывают друг друга:

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


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

Компилятор выдает ошибку в f1.Это говорит о том, что f2 не определен.Есть ли способ declare функция в clojure.Я могу убедиться, что рекурсия действительно заканчивается.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

существует также форма 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
0 голосов
/ 27 мая 2018

Буквально declare:

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

(defn f2 []
  (f1))
...