![](/img/trans.png)
[英]Are Javascript generator and Clojure lazy-seq conceptually same
[英]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.