Comment faire des définitions réciproquement réciproques dans Clojure?Définitions mutuellement récursives dans Clojure
Voici un code à Scala pour trouver des nombres premiers qui utilise des définitions récursives:
val odds: Stream[Int] = cons(3, odds map { _ + 2 })
val primes: Stream[Int] = cons(2, odds filter isPrime)
def primeDivisors(n: Int) =
primes takeWhile { _ <= Math.ceil(Math.sqrt(n))} filter { n % _ == 0 }
def isPrime(n: Int) = primeDivisors(n) isEmpty
primes take 10
Je traduis cela Clojure:
(def odds (iterate #(+ % 2) 3))
(def primes (cons 2 (filter is-prime odds)))
(defn prime-divisors [n]
(filter #(zero? (mod n %))
(take-while #(<= % (Math/ceil (Math/sqrt n)))
primes)))
(defn is-prime [n] (empty? (prime-divisors n)))
(take 10 primes)
Mais écrire les définitions du Clojure REPL un par un donne
java.lang.Exception: Unable to resolve symbol: is-prime in this context (NO_SOURCE_FILE:8)
après avoir écrit (def primes (cons 2 (filter is-prime odds)))
.
Existe-t-il un moyen de faire des définitions mutuellement récursives dans Clojure?
Le terme qui décrit ce que vous essayez de faire est que vous essayez de définir une paire de fonctions * mutuellement * récursives. J'ai modifié votre question pour que ce soit plus clair. –
@ken: merci de corriger la terminologie. –