2015-08-17 29 views
12

按照docsrange函數有四種形式:Clojure的範圍與特定的起始和無限遠端

  • (range) 0 - 無限
  • (range end) 0 - 端
  • (range start end)開始 - 結束
  • (range start end step)開始 - 結束跳過步驟

那麼我怎樣才能向Infinity聲明代表x的範圍呢?

我也可能會問如何參考無窮大,像(range x infinity)可能工作?

回答

16

(iterate inc x)會給你一個從x開始的懶惰無限序列號碼。

7

怎麼是這樣的:

(defn my-range 
    ([start] (iterate inc' start)) 
    ([start step] (iterate #(+' % step) start))) 

請注意inc'+'支持任意精度。

5

如何:

(defn range-from [start] 
    (drop start (range))) 
+1

我喜歡這個答案比'iterate'更好的答案背後的直覺,但我不知道'start'是大量是否會浪費計算。 – Mars

+0

@Mars同意 - 我認爲這個答案希望無論效率如何都會被其餘的無限範圍所掩蓋 - 哈! 它保留任何優化表示'範圍'使用... –

+0

如果你想保留範圍,那麼使用@Sean最初提出的解決方案可能是一個更好的主意:'(defn range-from [start](map#( +'start%)(range)))' – zero323