Scala Streams 及其堆栈内存使用情况

发布于 2024-12-22 14:28:16 字数 212 浏览 1 评论 0原文

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

def from(n:Int):Stream[Int] = Stream.cons(n, from(n+1))

我猜它需要恒定的堆栈内存。正确吗?对于任何递归定义的来说它是否正确?您能想到任何使用非常量堆栈内存的递归定义的stream示例吗?

Suppose, I have a recursively-defined Stream: e.g.

def from(n:Int):Stream[Int] = Stream.cons(n, from(n+1))

I guess it requires constant stack memory. Is it correct? Is it correct for any recursively-defined stream? Can you think of any recursively-defined stream example, which uses non-constant stack memory?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

水溶 2024-12-29 14:28:16

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

如果是这样,答案是肯定的: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 的实例(因为递归调用实际上并未在该处进行评估)观点)。

Are you asking whether accessing the stream requires constant stack memory?

If so the answer is yes: apply for Streams is defined in terms of drop (the definition is in LinearSeqOptimized), and drop is tail-recursive, so is compiled into a while loop.

That makes drop essentially look as follows:

def drop(n: Int) : Stream[A] = {
  var _this = this
  var _n = n

  while(!(_n <= 0 || _this.isEmpty)) {
    _this = _this.tail
    _n = _n - 1
  }
  _this
}

So the only increase in stack size can come from the call to _this.tail. In your definition of from, that call will never increase the stack: all it does is build an instance of Stream.cons (since the recursive call is not actually evaluated at that point).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文