我正在开发一个生成组合的小程序,我正在使用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值,它可能会导致很多项目。
我的问题是:这是否可以这样做,因为对于生成的每个项目,我必须做一些额外的处理?我不担心程序需要很长时间才能运行,我担心内存不足。
谢谢
答案 0 :(得分:1)
由于理解产生的数量非常高,因此最好采用iterator
或stream
实施。
以下函数将按需生成值,因此不会有内存错误的风险。
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)
}