Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多列表上的Scala递归_Scala_Recursion - Fatal编程技术网

多列表上的Scala递归

多列表上的Scala递归,scala,recursion,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 } 这里有两个问题: 我只在“a”列表中匹配 我尝试执行acc+h时出错,我不确定原因 问题:如何递归迭代两个列表以获得它们的总和?模式匹配两个列表: import sc

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

例如:

def sumOfSums(a: List[Int], b: List[Int]): Int = {
  var sum = 0
  for(elem <- a) sum += elem
  for(elem <- b) sum += elem
  sum
}
这里有两个问题:

  • 我只在“a”列表中匹配
  • 我尝试执行
    acc+h
    时出错,我不确定原因

  • 问题:如何递归迭代两个列表以获得它们的总和?

    模式匹配两个列表:

    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)
    }
    
    测试:

    收益率:

    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
    

    <>或考虑使用诸如<代码> FordDouth,<代码> FoLDMAP < /代码>等< < /P>不能在递归之前合并列表的机制吗?还有第二个问题,那是因为您的
    sumofsrumsrec
    需要3个参数,而不是2个。太棒了!非常感谢
    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