实现"分区"函数的递归

Jay*_*don 3 recursion tail-recursion clojure lazy-sequences

我随机阅读了Clojure源代码,我看到分区函数是在递归方面定义的,不使用"recur":

(defn partition
  ... ...
  ([n step coll]
     (lazy-seq
       (when-let [s (seq coll)]
         (let [p (doall (take n s))]
           (when (= n (count p))
             (cons p (partition n step (nthrest s step))))))))
  ... ...)
Run Code Online (Sandbox Code Playgroud)

这样做有什么理由吗?

A. *_*ebb 7

分区是懒惰的.递归调用partition发生在一个体内lazy-seq.因此,它不会立即被调用,而是在需要时进行评估的特殊seq-able对象中返回,并缓存到目前为止实现的结果.堆栈深度限制为一次一次调用.

没有lazy-seq的recur可以用来创建一个渴望版本,但你不希望在不确定长度的序列上使用它,就像你在核心版本中一样.