我有这个函数,它接受两个列表并返回两个列表的总和。
示例:
def sumOfSums(a: List[Int], b: List[Int]): Int = {
var sum = 0
for(elem <- a) sum += elem
for(elem <- b) sum += elem
sum
}
很简单,但是现在我试图递归地执行它,第二个列表参数让我失望。
到目前为止我所拥有的:
def sumOfSumsRec(a: List[Int], b: List[Int], acc: Int): Int = a match {
case Nil => acc
case h :: t => sumOfSumsRec(t, acc + h)
}
这里有2个问题:
List
acc + h
时收到错误,我不确定原因。问题:如何递归迭代两个列表以获得总和?
答案 0 :(得分:2)
模式匹配两个列表:
import scala.annotation.tailrec
def recSum(a: List[Int], b: List[Int]): Int = {
@tailrec
def recSumInternal(a: List[Int], b: List[Int], acc: Int): Int = {
(a, b) match {
case (x :: xs, y :: ys) => recSumInternal(xs, ys, x + y + acc)
case (x :: xs, Nil) => recSumInternal(xs, Nil, x + acc)
case (Nil, y :: ys) => recSumInternal(Nil, ys, y + acc)
case _ => acc
}
}
recSumInternal(a, b, 0)
}
测试:
recSum(List(1,2), List(3,4,5))
收率:
15
旁注:
对于这篇文章的任何未来读者,我认为这个问题主要是出于教育目的,因此显示了递归如何在多个列表中起作用,但这绝不是一种惯用的方法。出于任何其他目的,无论如何:
scala> val a = List(1,2)
a: List[Int] = List(1, 2)
scala> val b = List(3,4,5)
b: List[Int] = List(3, 4, 5)
scala> a.sum + b.sum
res0: Int = 15
或者考虑使用foldLeft
,foldMap
等机制