如何使用递归计算我的List
项值并返回所有List
元素总值的总和?
def getTotalValue(list: ListBuffer[Double], val: Double): Double = {
list.foreach(x => {
val += x
})
}
答案 0 :(得分:1)
这适用于任何Sequence(List和ListBuffer)
@tailrec
def getTotalValue(list: Seq[Double], value: Double): Double =
list.headOption match {
case Some(v) => getTotalValue(list.tail, value + v)
case None => value
}
E.g。使用它:
getTotalValue(ListBuffer(1,2,3,4), 0)
getTotalValue(List(1,2,3,4), 0)
将返回10.0
如果你想要特定于List的东西,你可以利用cons(::)运算符匹配head :: tail而不是使用headOption。
(虽然,我认为你这样做是为了学术目的。更简单的方法是使用总和。例如,列表(1,2,3,4).sum)
答案 1 :(得分:1)
试试这个
import scala.annotation.tailrec
def getTotal(list: List[Int]) = {
@tailrec
def get(list: List[Int], total: Int): Int = list match {
case head :: tail => get(tail, total + head)
case Nil => total
}
get(list, 0)
}
getTotal(List(90,8,98,10,-3)) // should be return 203
getTotal(List(15,10,20,10)) // should be return 55
答案 2 :(得分:1)
为了说明 plain 递归(非尾递归),请考虑
def f(xs: List[Double]): Double = if (xs.isEmpty) 0D else xs.head + f(xs.tail)
每当当前列表为空时我们返回0.0
,否则我们用当前列表的其余部分对f
的(递归)调用来总结当前列表的头值。
通过在每次递归调用中单调减小列表的大小,可以保证最终达到无关紧要的情况(空列表),因此对该函数的任何类型安全调用都会终止。此外,该函数定义明确,它涵盖了空列表和非空列表情况。