gpt4 book ai didi

clojure - Clojure 中的相互递归定义

转载 作者:行者123 更新时间:2023-12-04 13:35:20 25 4
gpt4 key购买 nike

如何在 Clojure 中进行相互递归定义?

这是 Scala 中的代码,用于查找使用递归定义的素数:

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

我将其翻译为 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)

但是在 Clojure REPL 中一一编写定义会给出
java.lang.Exception: Unable to resolve symbol: is-prime in this context (NO_SOURCE_FILE:8)

在我写 (def primes (cons 2 (filter is-prime odds))) 之后.

有没有办法在 Clojure 中进行相互递归定义?

最佳答案

您需要 (declare is-prime)在您第一次引用它之前。

这被称为“前向声明”。

关于clojure - Clojure 中的相互递归定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3213405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com