我对Scala很陌生,我在玩Array.tabulate方法。在执行这段简化的代码片段(最初是一个dp问题)时,我得到了一个StackOverFlowError。
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的答案编写的)
发布于 2013-09-27 03:29:16
我能够通过在Lazy中包装arr(0)(0)来解决这个问题,因此它被计算为一个按名称调用的参数,从而不会在表方法中计算arr。我所引用的代码是使用it (二进制+操作符)自动转换它的,所以它不是明确的剪切。
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)
}谢谢大家。
发布于 2013-09-26 19:58:37
你实际上导致了无限的递归。您根本不能在lazy val本身的初始化代码中引用它。您需要分别计算arr(0)(0)。
发布于 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?
https://stackoverflow.com/questions/19037381
复制相似问题