2017-10-06 6 views
1

私は2つのリストを取り、2つのリストの合計を返すこの関数を持っています。複数のリストにわたるスカラ再帰

例:十分

def sumOfSums(a: List[Int], b: List[Int]): Int = { 
    var sum = 0 
    for(elem <- a) sum += elem 
    for(elem <- b) sum += elem 
    sum 
} 

シンプルな、しかし今私は再帰的にそれをやろうとしていると、2番目のリストのパラメータは、私を投げています。

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. 私は、私はエラーを取得しています '' List
  2. に一致していますが、私がこれまで持って何

    acc + hをしようとすると、なぜわからないのですか。

質問:質問:合計を得るために2つのリストを再帰的に反復することはできますか?

+1

あなたが再帰前にリストをマージすることはできません使用することを検討してください:その他の目的のために、すべての手段で? 2番目の問題については、 'sumOfSumsRec'が2ではなく3つの引数を必要とするためです。 – Shaido

答えて

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 

サイドノート:いずれについても

この投稿の今後の読者は、私はこの質問がprinarly教育的な目的のために尋ねられたので、再帰が複数のリストでどのように動作するかを示していると仮定しましたが、これは慣用的な方法ではありません。

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、などのメカニズム

+1

素晴らしい!本当にありがとう – Phillip

関連する問題