假设我有一个递归定义的Stream
:例如
def from(n:Int):Stream[Int] = Stream。缺点(n (n + 1) 之前我猜它需要恒定的堆栈内存。对吗?它对任何递归定义的
stream
都是正确的吗?你能想到任何递归定义的stream
的例子,它使用非恒定堆栈内存?
您是否在问访问流是否需要恒定的堆栈内存?
如果是,答案是肯定的:Stream
的apply
是根据drop
定义的(定义在LinearSeqOptimized
中),drop
是尾递归的,因此编译成while
循环。
这使得drop
基本上看起来如下:
def drop(n: Int) : Stream[A] = {
var _this = this
var _n = n
while(!(_n <= 0 || _this.isEmpty)) {
_this = _this.tail
_n = _n - 1
}
_this
}
所以堆栈大小的唯一增加可能来自对_this.tail
的调用。在您对from
的定义中,该调用永远不会增加堆栈:它所做的只是构建Stream.cons
的一个实例(因为递归调用实际上并未在该点求值)。