![](/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.