Scala递归多个列表

时间:2017-10-06 06:50:01

标签: scala recursion

我有这个函数,它接受两个列表并返回两个列表的总和。

示例:

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个问题:

  1. 我只匹配&#39; a&#39; List
  2. 我尝试acc + h时收到错误,我不确定原因。
  3. 问题:如何递归迭代两个列表以获得总和?

1 个答案:

答案 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

或者考虑使用foldLeftfoldMap等机制