Scala:通过递归计算列表项值

时间:2016-07-24 14:27:15

标签: scala recursion

如何使用递归计算我的List项值并返回所有List元素总值的总和?

  def getTotalValue(list: ListBuffer[Double], val: Double): Double = {

    list.foreach(x => {
      val += x
    })
  }

3 个答案:

答案 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的(递归)调用来总结当前列表的头值。

通过在每次递归调用中单调减小列表的大小,可以保证最终达到无关紧要的情况(空列表),因此对该函数的任何类型安全调用都会终止。此外,该函数定义明确,它涵盖了空列表和非空列表情况。