scala - 使用尾递归和匹配表达式对 Scala 中的选项列表求和

标签 scala

我必须使用匹配表达式创建一个尾递归程序,该程序将打印 List[Option[Double]] 类型的 List 的总和 f.e 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)

我只知道如何仅对某些(值)列表进行求和,不知道如何仅对正参数求和。

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))))

最佳答案

您可以使用 pattern match guard为此:

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)

关于scala - 使用尾递归和匹配表达式对 Scala 中的选项列表求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66735121/

相关文章:

scala - 在 Scala 项目中,如何将 play 框架用作库

scala - 案例类的收缩宏

algorithm - 更改优先级队列中项目的优先级

parsing - 获取有关 Groovy 函数的信息(名称、签名、主体代码)

Scala-使用foreach将列表写入文件

scala - 循环遍历 Map Spark Scala

scala - 关于 Future.firstCompletedOf 和 Garbage Collect 机制

java.lang.ClassNotFoundException : org. jboss.netty.channel.ChannelFactory 在intellij idea中运行 Play 项目

Scala 的密封抽象与抽象类

java - Java 到 Scala 中的常见习惯用法,遍历/迭代 Java 列表到 Scala 列表