繁体   English   中英

使用Clojure中的范围的Lazy-Seq生成器

[英]Lazy-seq generator using range in clojure

说我想创建一个从1到m的所有数字的惰性序列,它们与m最大公约数等于1

(def m 38941629971148227236N)
(def possible-e
  (lazy-seq (filter #(= 1 (gcd % m)) (range 1 m) ))
  )

然后我可以take像序列

(take 10 possible-e)
=> (1 3 5 7 9 11 13 15 17 19)

但是当我尝试以不同的方式做同样的事情时,事情就不起作用了。 我认为它正在计算所有数字,因为打印任何东西都像永远一样:

(def possible-e
  (lazy-seq (filter #(= 1 (gcd % m)) (reverse (range 1 m)) ))
  )

为什么它不能以相同的方式工作? 有什么解决办法?

问题在这里:

(reverse (range 1 m))

在代码可以进行filter之前,它必须计算出完整的range 您可以改用负步range

(def possible-e
  (lazy-seq (filter #(= 1 (gcd % m)) (range (dec m) 0 -1)))
)

扩展评论:

  • filter是惰性的,因此lazy-seq在这两种情况下都是多余的。
  • 不要(def m ...) 使possible-e一个带有参数m的函数成为possible-e

所以我们得到

(defn possible-e [m]
  (filter #(= 1 (gcd % m)) (range 1 m)))

(def m 38941629971148227236N)

(defn possible-e [m]
  (filter #(= 1 (gcd % m)) (reverse (range 1 m))))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM