Aggregate
Aggregateは汎用性のあるメソッドで、これを利用すれば、 通常の数列の和や積の計算はもちろん、連分数や多重平方根の計算まで可能である。 maximaでいえば「lreduce」とほぼ同じ機能のメソッドで、 一般的には「fold left」とよばれる概念。
さらに数列に限らず、様々なデータ型の列、例えば、文字列の列に関しても利用できる。
利用方法
あるデータ型Dの列 sequence={A1,A2,A3} と データ型Dを値としてとる2変数関数$f(x,y)$があった時
sequence.Aggregate(f)
は f(f(A1,A2),A3) となる。
sequence ={A1,A2,A3,A4} であれば
f(f(f(A1,A2),A3),A4)
となる。一般的にsequenceの長さに特に制限はない。
例1
var r = Enumerable.Range(1, 3).Aggregate((x, y) => x + y); Console.WriteLine(r);
実行結果.
6
解説
最初 \[1+2 =3\] を行い、次にこの結果$3$を用いて \[3+3=6\] を行う。
例2
var z = new string[] { "a", "b", "c" }.Aggregate((x, y) => x + y); Console.WriteLine(z);
実行結果.
abc
解説
最初、文字列として
"a+"b" = "ab"
を行い、次にこの結果"ab"を用いて
"ab"+"c" = "abc"
を行う。
例3
var w = Enumerable.Range(1, 3).Aggregate((x, y) => (1+x)*y); Console.WriteLine(w);
実行結果.
15
解説
最初、 \[ a:=(1+1)\times 2 \] を行い、次にこの結果を用いて \[ (1+a)\times 3 \] を行う。これらの計算をあわせると \[ (1+(1+1)\times 2)\times 3 \] という計算していることになる。
連分数の計算
例
var cf = Enumerable.Range(1,3).Select(x => x + 0.0).Aggregate((x, y) => 1.0 / x + y); Console.WriteLine(cf);
実行結果.
3.33333333333333
解説
\[ \cfrac{1}{\cfrac{1}{1}+2}+{3} = \frac{10}{3} \] という計算を行っている。
通常の連分数とは順序が逆になるので注意が必要。 (maximaであればrreduceを用いるが、LINQにはこれに対応するメソッドがない。 したがって、rreduceのようなものを拡張メソッドとして定義するか、 あるいは、少し面倒であるが、シーケンスを逆順にして適用するしかない。 )