Loops 在Clojure中使用递归生成惰性seq?
我是clojure的新手,目前正在努力解决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次。在我的范围内,您不会使用任何惰性构造。由于您是通过
循环/重复
。问题基本上是为什么我的“自定义”范围是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)))