在Clojure中,如何编写自己的递归函数来处理惰性列表?

int*_*tar 3 recursion clojure lazy-evaluation

我只是想向某人展示懒惰,我写了一个简单的递归函数来处理一个列表.

我认为在无限列表中它会很好.但突然间我发生了"过多的递归"内部错误.

咦?我总是编写代码来做那种事情.有什么问题?

但是,当然,通常我使用内置函数map作为其他列表处理函数的基础.这次我试图编写自己的递归遍历.当然,这不可行.

这是我写的.

(defn q [xs] 
  (if (empty? xs) () 
    (cons (* (first xs) (first xs)) (q (rest xs)) )))

(take 10 (q (cycle '(1 2 3 4))))
Run Code Online (Sandbox Code Playgroud)

那么,实际上我是如何编写自己的遍历函数来处理Clojure中的惰性数据结构的呢?是否存在某种"收益率"的等价物?

Cha*_*ffy 6

(defn q [xs] 
  (if (empty? xs) () 
    (lazy-seq  ;; <- here's our magic!
       (cons (* (first xs) (first xs)) (q (rest xs)) ))))

(take 10 (q (cycle '(1 2 3 4))))
Run Code Online (Sandbox Code Playgroud)

  • 好,但应该是`(defn q [xs](lazy-seq(if ...)))`,这样输入序列中的项只有在需要输出序列中的项时才能实现.如上所述,您总是从输入seq中消耗一个以上的项目.根据经验,当你产生一个懒惰的序列时,你应该确保`lazy-seq`被包裹在强制输入元素的任何东西周围(比如seq,first,rest或empty?). (3认同)