我对 Scala 很陌生!但是,我想使用以下针对欧拉问题 4 的工作解决方案,只是par
为了看看我是否可以做到:
import scala.math
object Problem4 {
def isPalindrome(x: Int): Boolean = {
val string = x.toString
string.reverseIterator.sameElements(string.iterator)
}
def getPairs(minimum: Int, maximum: Int) = {
for (i <- minimum to maximum view;
j <- minimum to maximum view)
yield (i, j)
}
def getAnswer(numberOfDigits: Int): Int = {
val maximum = math.pow(10, numberOfDigits).toInt
val minimum = math.pow(10, numberOfDigits - 1).toInt
val products = for {
pair <- getPairs(minimum, maximum)
product = pair match { case (i, j) => i * j }
if isPalindrome(product)
} yield product
products.par.max
}
def main(args: Array[String]) {
val answer = getAnswer(4)
println("Problem 4 answer: %s".format(answer))
}
} // object Problem4
Project Euler 4要求输入 3 位数字,我注意到在我的 PC 上找到 4 位数字的答案需要 63 秒,并且在我的双核系统上只使用一个处理器。尽管这适用par
于for
表达式的末尾。
我如何并行化这个使用par
?理想情况下,我想找到 4 位数字的答案需要 30-40 秒。谢谢!
编辑:我很确定getPairs
返回一个View
:
scala> def getPairs(minimum: Int, maximum: Int) = {
| for (i <- minimum to maximum view;
| j <- minimum to maximum view)
| yield (i, j)
| }
getPairs: (minimum: Int, maximum: Int)scala.collection.SeqView[(Int, Int),Seq[_]]
此外,添加par
到getPairs
调用会返回一个警告,仍然只使用我的一个处理器,并导致java.lang.OutOfMemoryError: Java heap space
异常:
[info] Loading project definition from M:\programming\testdriveneuler\src\problem4\project
[info] Set current project to euler (in build file:/M:/programming/testdriveneuler/src/problem4/)
[info] Compiling 1 Scala source to M:\programming\testdriveneuler\src\problem4\target\scala-2.9.2\classes...
[warn] M:\programming\testdriveneuler\src\problem4\src\main\scala\Problem4.scala:39: `withFilter' method does not yet exist on scala.collection.parallel.ParSeq[((Int, Int), Int)], using `filter' method instead
[warn] pair <- getPairs(minimum, maximum).par
[warn] ^
[warn] one warning found
编辑:我对计算 2 个 4 位数字乘积的欧拉问题 4 的答案非常感兴趣。供参考,答案是99000099
。