scala - 使用尾递归和匹配表达式对 Scala 中的选项列表求和
问题描述
我必须使用匹配表达式制作一个尾递归程序,它将打印List[Option[Double]]
fe类型的列表的总和List(Some(1), ..., Some(n)) --> Some(1 + ... + n)
但它只对具有正数的列表求和,因此当 Some(d) 和 d < 0 时它不计算在内。
List(Some(1.0),Some(2.0), Some(-3.0) ---> Some(3.0)
当没有任何积极的元素时,它应该返回None
sumuj(List(Some(2.0), Some(4.0), Some(-3.0), None, Some(-3.0), None, Some(1.0))) returns Some(7.0)
我只知道如何仅对 Some(value) 列表求和,不知道如何仅对正论点求和。
def sumuj(l: List[Option[Double]]): Option[Double] = {
def helper(l: List[Option[Double]], acc: Double): Option[Double] = {
l match {
case head :: tail => head match {
case Some(value) => helper(tail, acc + value)
}
case Nil => Some(acc)
}
}
helper(l, acc = 1)
}
println(sumuj(List(Some(2.0), Some(4.0), Some(-3.0))))
解决方案
您可以为此使用模式匹配保护:
def sumPositives(l: List[Option[Double]]) = {
@tailrec
def sumPositives0(l: List[Option[Double]], acc: Double): Option[Double] =
l match {
case Some(head) :: tail if head > 0 => sumPositives0(tail, acc + head)
case _ :: tail => sumPositives0(tail, acc)
case Nil => Some(acc)
}
sumPositives0(l, acc = 1)
}
接着:
println(sumPositives(List(Some(2.0), Some(4.0), Some(-3.0))))
产量:
Some(7.0)
推荐阅读
- folly - 如何在 Facebook 愚蠢库中运行测试?
- wordpress - 通过 Wordpress Rest API 将文件上传到文件夹
- postgresql - SQL Server for PostgreSQL 中的 SQL_Latin1_General_CP1254_CI_AS 的等价物是什么?
- r - 如何在 R 中循环修改多个单元格而不丢失格式?
- python - Python如果名称主要变量未定义
- javascript - 为fullcalendar js的每个事件插入一个谷歌地图链接
- python - 具有数字线间距分布的 Seaborn 条形图
- javascript - 如何在javascript中更改json文件导入路径
- javascript - 当屏幕宽度小于数量时更改文本不起作用
- python - 如何使用 python-sounddevice 录制音频输出?