11511


Scalaで総数を返す再帰のコードでよく使われるのが、下記のような書き方です。

[code]

     def sumList(list:List[Int]): Int = {
        list match {
            case Nil => 0
            case x::list => x + sumList(list)
        }        
    }
    
[/code]

case Nilがマッチする為には引数のlistをtailするしかないことは理解出来ました。

が、 case x::list => x + sumList(list)を実行することでlistがtailされていくことがわかりません...
::演算子は左側の要素を右側のリストに連結するものなので、混乱しています。

なぜこの再帰呼び出しで引数のlistがtailされていくのでしょうか？


CC BY-SA 3.0
2015-06-19T04:31:00.097
11499
2015-06-19T07:43:10.567
2015-06-19T06:39:12.190
241
5766
question
scala
Scalaで整数型のリストの総和を再帰で求める方法について


変数名を整理し、途中経過をprintしてみました。

[code]

    def sumList(list:List[Int]): Int = {
        list match {
            case Nil => 0
            case head::tail => {
                println(head)
                println(tail)
                head + sumList(tail)
            }
        }        
    }
    
[/code]

結果は次のとおり。

[code]

    scala> sumList(List(1,2,3,4,5))
    1
    List(2, 3, 4, 5)
    2
    List(3, 4, 5)
    3
    List(4, 5)
    4
    List(5)
    5
    List()
    res10: Int = 15
    
[/code]

`::`はおっしゃるように左側の要素を右側のリストに連結するので`1 :: List(2,3,4,5)`は`List(1,2,3,4,5)`と同じです。

ここでは逆に`match`しようとしているので`List(1,2,3,4,5)`が`head::tail`、つまり`1::List(2,3,4,5)`にマッチしてheadが1,
tailが(2,3,4,5)になります。あとは再帰しています。単純に先頭から１要素取り出すと思っていいでしょう。


CC BY-SA 3.0
2015-06-19T07:43:10.567
11511
2015-06-19T07:43:10.567
7837
11499
answer