簡體   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