我正在学习 scala 并享受它,它是一种非常强大的语言。我编写了这个程序来解决 Euler #2 问题,来自项目 euler。它是找到小于 400 万的偶数斐波那契数的总和(称为 max#)。
首先我使用了takeWhile,然后过滤:
fib().takeWhile(_ < n).filter(_ % 2 == 0).sum
然后决定在 takeWhile 之前更改顺序并使用过滤器:
fib().filter(_ % 2 == 0).takeWhile(_ < n).sum
我这样做是为了检查增加 max# 时是否存在性能差异。结果是准确的,正如预期的那样,性能几乎相同,直到我使用这个输入数字 (4000000000000001237) 并得到 2 个不同的结果。结果是:
$ scala com.ms.E2_1 4000000000000001237
takeWhile 1st => 3770056902373173214
filter 1st => -8573983172444283806
有人可以解释为什么我在 takeWhile 之前使用过滤器时会出现此错误吗?谢谢你。
object E2_1 {
def fib(a: Long = 0, b: Long = 1): Stream[Long] = {
a #:: fib(b, a + b)
}
def main(args: Array[String]): Unit = {
if (args.length == 1) {
val n = args(0).toLong
println("takeWhile 1st \t=> " + fib().takeWhile(_ < n).filter(_ % 2 == 0).sum)
println("filter 1st \t=> " + fib().filter(_ % 2 == 0).takeWhile(_ < n).sum)
} else {
println("missing args")
}
}
}