recursion - Clojure 中的递归惰性序列

标签 recursion clojure lazy-evaluation

我不明白为什么这个lazy-seq会导致stackoverflow,当你将序列传递给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 有效?

最佳答案

在您的示例函数中返回 lazyseq (0 (1 (2 (3 (...))))) .这就是为什么dorun在没有计算器溢出的情况下运行(有两个元素的序列 0(1 (2 (...)))dorun 不计算)和 second失败(它返回无限嵌套序列,repl 尝试评估以打印输出)。

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

(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)

关于recursion - Clojure 中的递归惰性序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14002358/

相关文章:

javascript - 无法使用递归求解所有情况的幂和

python - newB 在 Udacity Computer 与 Backus Naur 斗争。科学。 101

javascript - 在嵌套的 js 对象数组中搜索

java - 动态规划过程

scala - 递归流抛出 StackOverflowError

list - Haskell 惰性求值和带有无限列表的 let-in 表示法

clojure - 我如何从文件中反序列化记录结构,已经使用 print-dup 保存到文件中?

clojure - 将嵌套映射列表转换为映射的替代方法

clojure - ClassNotFoundException 试图为任何项目运行 "lein run server-headless"

c++ - boost eval_if 的惰性评估