是否建议使用带有收益率的理解来返回大量的物品?

时间:2016-10-16 09:02:48

标签: scala

我正在开发一个生成组合的小程序,我正在使用for理解。像这样:

def posibilities2(n: Int): Seq[List[Int]] = {
  val maxValues = (1 to 3).map(i => n / i).toList
  for {
    n1 <- 0 to maxValues(0)
    n2 <- 0 to maxValues(1)
    n3 <- 0 to maxValues(2)
    if n1 * 1 + n2 * 2 + n3 * 3  == n
  }
    yield List(n1, n2, n3)
}  

posibilities2(1000).foreach(doSomething)

对于较大的n值,它可能会导致很多项目。

我的问题是:这是否可以这样做,因为对于生成的每个项目,我必须做一些额外的处理?我不担心程序需要很长时间才能运行,我担心内存不足。

谢谢

1 个答案:

答案 0 :(得分:1)

由于理解产生的数量非常高,因此最好采用iteratorstream实施。

以下函数将按需生成值,因此不会有内存错误的风险。

  def posibilities2(n: Int): Iterator[(Int, Int, Int)] = {

    val maxValues = (1 to 3).map(i => n / i).toList
    for {
      n1 <- (0 to maxValues(0)).toIterator
      n2 <- (0 to maxValues(1)).toIterator
      n3 <- (0 to maxValues(2)).toIterator
      if n1 * 1 + n2 * 2 + n3 * 3  == n
    } yield (n1, n2, n3)

  }