gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:55:19 25 4
gpt4 key购买 nike

我必须使用匹配表达式制作一个尾递归程序,该程序将打印类型 List[Option[Double]] 的列表的总和
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)
我只知道如何对 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))))

最佳答案

您可以使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com