没有标准的inclusive-range
函数 - 根据Kevin Ingle的术语。
你可以在range
的基础上构建一个:
(defn inclusive-range
([] (range))
([end] (range (inc end)))
([start end] (range start (inc end)))
([start end step] (range start (+ end step) step)))
(inclusive-range 10 11.5)
;(10 11 12)
(10 11 12)
看起来并没有本质上的错误。@JohnCollins的 irange
产生了 (10 11)
,这也看起来并没有本质上的错误。inclusive-range
的一个更重要的问题是由于浮点误差:(inclusive-range 0 0.8 0.1) ;=> (0 0.1 0.2 0.30000000000000004 0.4 0.5 0.6 0.7 0.7999999999999999 0.8999999999999999)
。irange
在这里得到了正确的结果:(0 0.1 0.2 0.30000000000000004 0.4 0.5 0.6 0.7 0.7999999999999999)
。 - Mars<=
替换为 <
,你就得到了标准的 range
。 - Thumbnail(defn inclusive-range [start end] (range start (inc end)))
或者更一般地说,定义一个仅添加结尾的函数:
(defn inclusive-range [start end step] (flatten (list (range start end step) end)))
正如评论中指出的那样,上述解决方案可能不是最理想的。您提到您习惯于使用guava的Range,所以您也可以导入它并使用:
(import 'com.google.common.collect.Range)
(-> (Range/closed 1 10)
(.contains 10)) ; returns true
(inclusive-range 0 1 -1)
。 - Diego Basch(defn my-range [start & {:keys [up-to down-to]}]
(cond (and (nil? up-to) (nil? down-to)) (range (inc start))
(nil? down-to) (range start (inc up-to))
:else (range start (dec down-to) -1)))
user> (my-range 10)
(0 1 2 3 4 5 6 7 8 9 10)
user> (my-range 0 :up-to 10)
(0 1 2 3 4 5 6 7 8 9 10)
user> (my-range 10 :down-to -10)
(10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10)
它略显啰嗦,但符合简单的范围行为,并添加了一些甜蜜的语法。
(defn irange
([start end step]
(take-while (if (pos? step) #(<= % end) #(>= % end)) (iterate #(+ % step) start)))
([start end]
(irange start end 1))
([end]
(irange 0 end))
([] (range)))
在Clojure中没有标准的包容范围函数,但是你可以通过以下方式实现
(defn inclusive-range [n] (map inc (range 0 n)))
(inclusive-range 10)
range 0也会被递增,因此保持为-1
相同问题的另一种解决方案
(defn inclusive-range [count] (range 0 (+ 1 count) ))
(range n (- 1) (- 1))
而不是(range n -1 -1)
? - Diego Basch