【发布时间】:2019-02-19 12:59:49
【问题描述】:
我正在编写一个 Scala 函数,它返回列表中偶数元素的总和,减去列表中奇数元素的总和。我的解决方案不能使用可变、递归或 for/while 循环。下面的代码通过了 2/3 次测试,但我似乎无法弄清楚为什么它不能正确计算最后一次测试。
def sumOfEvenMinusOdd(l: List[Int]) : Int = {
if (l.length == 0) return 0
val evens = l.filter(_%2==0)
val odds = l.filter(_%2==1)
val evenSum = evens.foldLeft(0)(_+_)
val oddSum = odds.foldLeft(0)(_+_)
evenSum-oddSum
}
//BEGIN TESTS
val i1 = sumOfEvenMinusOdd(List(1,3,5,4,5,2,1,0)) //answer: -9
val i2 = sumOfEvenMinusOdd(List(2,4,5,6,7,8,10)) //answer: 18
val i3 = sumOfEvenMinusOdd(List(109, 19, 12, 1, -5, -120, -15, 30,-33,-13, 12, 19, 3, 18, 1, -1)) //answer -133
我的代码输出如下:
defined function sumOfEvenMinusOdd
i1: Int = -9
i2: Int = 18
i3: Int = -200
我非常困惑为什么这些负数会影响我的其余代码。我看到一篇文章解释了使用 foldLeft foldRight 的操作顺序,但即使更改为 foldRight 仍然会产生 i3: Int = -200。有没有我遗漏的细节?任何指导/帮助将不胜感激。
【问题讨论】:
-
所以问题是
-3 % 2 == -1这意味着您的两个过滤器语句实际上都只会抛出所有负奇数。我也认为你可以用一个 foldLeft/foldRight 来做到这一点
标签: scala filter pattern-matching fold