首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Array.tabulate StackOverFlowError

Array.tabulate StackOverFlowError
EN

Stack Overflow用户
提问于 2013-09-26 19:49:22
回答 3查看 627关注 0票数 0

我对Scala很陌生,我在玩Array.tabulate方法。在执行这段简化的代码片段(最初是一个dp问题)时,我得到了一个StackOverFlowError。

代码语言:javascript
复制
  import Lazy._

  class Lazy[A](x: => A) {
    lazy val value = x
  }

  object Lazy {
    def apply[A](x: => A) = new Lazy(x)
    implicit def fromLazy[A](z: Lazy[A]): A = z.value
    implicit def toLazy[A](x: => A): Lazy[A] = Lazy(x)
  }

  def tabulatePlay(): Int = {
    lazy val arr: Array[Array[Lazy[Int]]] = Array.tabulate(10, 10) { (i, j) =>
      if (i == 0 && j == 0)
        0 // some number
      else
        arr(0)(0)
    }
    arr(0)(0)
  }

调试时,我注意到由于arr是懒惰的,当它到达arr(0)(0)表达式时,它试图通过一次又一次地调用Array.tabulate方法来计算它。

我做错什么了?(我更新了代码片段,因为我是根据Dynamic programming in the functional paradigm中给出的解决方案,特别是Antal的答案编写的)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-27 03:29:16

我能够通过在Lazy中包装arr(0)(0)来解决这个问题,因此它被计算为一个按名称调用的参数,从而不会在表方法中计算arr。我所引用的代码是使用it (二进制+操作符)自动转换它的,所以它不是明确的剪切。

代码语言:javascript
复制
 def tabulatePlay(): Int = {
    lazy val arr: Array[Array[Lazy[Int]]] = Array.tabulate(10, 10) { (i, j) =>
      if (i == 0 && j == 0)
        1 // some number
      else
        new Lazy(arr(0)(0))
    }
    arr(0)(0)
  }

谢谢大家。

票数 0
EN

Stack Overflow用户

发布于 2013-09-26 19:58:37

你实际上导致了无限的递归。您根本不能在lazy val本身的初始化代码中引用它。您需要分别计算arr(0)(0)

票数 0
EN

Stack Overflow用户

发布于 2013-09-26 20:04:39

我不知道您为什么要在构建arr之前访问arr,似乎使用tabulate来填充数组中的函数--调用arr总是会导致无限递归。

参见这里Rex的例子(以及对他的投票),也许这会有所帮助。

In a multidimensional sequence created with tabulate, is the innermost seq the 1. dimension?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19037381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档