我接受了“99 Scala Problems”,我遇到了Problem 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”列表实际上将在内部表示。我们是否可以访问此内部表示?或者这是我们真正应该避免的事情吗?
答案 0 :(得分:1)
不,我不认为这是可能的。你可以编写自己的扩展方法,它的工作原理如下:
implicit class RichAny[A](x: A) extends AnyVal {
def use(f: A => B) = f(x) // could have a better name
}
并将其用作
listPrimesinRange(2 to n).takeWhile(x=> x < (n-x)).
use(primes => primes.filter(x => primes.contains(n-x))