Clojure中的递归懒惰序列

时间:2012-12-22 11:15:32

标签: recursion clojure lazy-evaluation

我无法理解为什么这个lazy-seq导致堆栈溢出,为什么不将序列传递给dorun:

(defn very-lazy [s]
    (lazy-seq
   (if (seq s)
     [(first s) (very-lazy (rest s))]
     [])))

(dorun (very-lazy (range 200000000)))
>nil

(take 2 (very-lazy (range 20000000))
>...(1577 (java.lang.StackOverflowError

如果它很懒,那么take 2应该导致懒惰的seq只迭代两次,为什么不发生以及为什么dorun有效?

1 个答案:

答案 0 :(得分:3)

在您的示例函数中,返回lazyseq (0 (1 (2 (3 (...)))))。这就是为什么dorun在没有stackoverflow的情况下运行的原因(0(1 (2 (...)))的序列有两个元素dorunsecond,而(defn very-lazy [s] (lazy-seq (if (seq s) (cons (first s) (very-lazy (rest s))) []))) (take 10 (very-lazy (range 200000000))) -> (0 1 2 3 4 5 6 7 8 9) 失败(它返回无限) repl尝试评估打印输出的嵌套序列。)

我猜你正在寻找这个解决方案

{{1}}