Scala流及其堆栈内存使用



假设我有一个递归定义的Stream:例如

def from(n:Int):Stream[Int] = Stream。缺点(n (n + 1) 之前

我猜它需要恒定的堆栈内存。对吗?它对任何递归定义的stream都是正确的吗?你能想到任何递归定义的stream的例子,它使用非恒定堆栈内存?

您是否在问访问流是否需要恒定的堆栈内存?

如果是,答案是肯定的:Streamapply是根据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的一个实例(因为递归调用实际上并未在该点求值)。

相关内容

  • 没有找到相关文章

最新更新