我学习了“ 99 Scala Problems ”,遇到了问题 40,即哥德巴赫猜想。
我想出了这个解决方案,它实际上输出所有素数对,其总和是给定的数字:
def goldbach(n : Int) = {
val lprimes = listPrimesinRange(2 to n) // all primes less than n
lprimes.takeWhile(x=> x < (n-x)).filter(x=> lprimes.contains(n-x)).map(x=> (x,n-x))
}
完美运行,但不是单线。这是因为在过滤操作中,我们需要参考初始素数列表。有没有办法写这样的东西:
def goldbach(n : Int) = {
listPrimesinRange(2 to n).takeWhile(x=> x < (n-x)).filter(x=> ???.contains(n-x)).map(x=> (x,n-x))
}
...在哪里 '???' 会被一个合适的表达式代替吗?
好的,我知道要求匿名值的“名称”是自相矛盾的。但是,因为我解决这个问题只是为了好玩,所以这是一个了解 Scala 内部结构的机会;在这种比喻性的单线方法中,最初的“lPrimes”列表实际上将在内部表示。我们可以访问这个内部表示吗?或者这是我们真的应该避免的事情?