“迭代提供了无限的懒惰序列”
(= (range 20) (take 20 (iterate inc 0)))我的问题是为什么它从0开始,而不是从1开始?如何理解这里的懒惰?
发布于 2014-02-14 03:06:13
Clojure.core/迭代采用两个参数:
fn。应用时,它应该生成序列中的下一个元素。(iterate inc 0)将0作为序列的初始元素。
(take 1 (iterate inc 0)) ;; (0)发布于 2014-02-14 05:01:16
koan要求迭代从零开始,因为默认情况下,range从0开始,这是一个漂亮的语句。在编程中,从0开始计数是典型且有用的,而不是1。但是,考恩可以写成从1开始(或任何其他数字)。
(= (range 1 21) (take 20 (iterate inc 1)))下面是迭代的定义
user=> (source iterate)
(defn iterate
"Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects"
{:added "1.0"
:static true}
[f x] (cons x (lazy-seq (iterate f (f x)))))所以,下面是(iterate inc 0)最初的看法
(cons 0, (lazy-seq (iterate inc (inc 0))))现在,当第一次访问位置1(即自0计数以来的第二个位置)的特殊延迟-seq元素时,它实际上被它的展开所取代。
-- (iterate inc (inc 0))
-> (iterate inc 1)
-> (cons 1, (lazy-seq (iterate inc (inc 1))))所以,这个序列现在看起来
-- (cons 0, (lazy-seq (iterate inc (inc 0))))
-> (cons 0, (cons 1 (lazy-seq (iterate inc (inc 1)))))当第一次访问位置2的特殊延迟-seq元素时,它实际上被它的展开所取代。
-- (iterate inc (inc 1))
-> (iterate inc 2)
-> (cons 2, (lazy-seq (iterate inc (inc 2))))所以,这个序列现在看起来
-- (cons 0, (cons 1 (lazy-seq (iterate inc (inc 1)))))
-> (cons 0, (cons 1, (cons 2, (lazy-seq (iterate inc (inc 2))))))一些需要注意的后果,但作为一个新用户通常不需要担心任何事情。
with-块中返回。(def numbers (iterate inc 0))并实现了其中的一堆,它们将保留在内存中。如果这是一个问题,避免“抱着头”。https://stackoverflow.com/questions/21770048
复制相似问题