Loops 在Clojure中使用递归生成惰性seq?

Loops 在Clojure中使用递归生成惰性seq?,loops,recursion,clojure,Loops,Recursion,Clojure,我是clojure的新手,目前正在努力解决循环/重复。问题基本上是为什么我的“自定义”范围是func。不返回惰性序列。我的实现是否有问题,或者在这种情况下不应该使用递归 (defn my-range [nr] (loop [l nr acc '()] (if (< l 1) acc (recur (dec l) (conj acc l))))) 巨大的时差让我相信,列表是先构造的,然后再进行10次。在我的范围内,您不会使用任何惰性构造。由于您是通过

我是clojure的新手,目前正在努力解决
循环/重复
。问题基本上是为什么我的“自定义”范围是func。不返回惰性序列。我的实现是否有问题,或者在这种情况下不应该使用递归

(defn my-range
  [nr]
  (loop [l nr acc '()]
    (if (< l 1)
      acc
      (recur (dec l) (conj acc l)))))

巨大的时差让我相信,列表是先构造的,然后再进行10次。

我的范围内,您不会使用任何惰性构造。由于您是通过从末尾开始并朝着开始的方向来组合列表的,因此访问前十个元素的唯一方法是首先实现所有其他元素

惰性序列从开始到结束,如下所示:

(defn my-range
  ([end]
   (my-range 1 end))
  ([start end]
   (when (<= start end)
     (lazy-seq (cons start (my-range (inc' start) end))))))
当有人对该对象调用
seq
时,它将调用上述函数,缓存其结果,并返回该结果。以后调用
seq
将只返回缓存的结果。但是,请注意,传递给
cons
的第二个参数也是一个惰性序列(因为调用
my range
返回一个
lazy seq
),因此,它只有在必要时才会实现

为了完整起见,编写此函数的另一种方法如下:

(defn my-range
  [end]
  (take end (iterate inc' 1)))

这是因为
iterate
take
都返回惰性序列。

非常感谢。以我有限的知识,我得到了这个想法。但是,我不明白您为什么使用
inc'
而不是
inc
?请尝试
(inc-Long/MAX\u值)
(inc-Long/MAX\u值)
。标准
范围从
0
开始,而不是从
1
开始。这并不影响这个问题。
#(cons start (my-range (inc' start) end))
(defn my-range
  [end]
  (take end (iterate inc' 1)))