我现在正在学习惰性序列,我注意到它们通常涉及递归而不使用recur
. 例如,这里是 的实现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)))))
我的印象是,如果你在不使用的情况下递归recur
,它会为每次调用创建一个新的堆栈帧,如果你迭代足够多的时间,这可能会导致堆栈溢出。
lazy-seq
吞噬堆栈帧吗?如果不是,它如何避免这种情况?