問題
偶数のフィボナッチ数
フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...数列の項の値が400万を超えない範囲で, 偶数値の項の総和を求めよ.
ぼくの解答
static void Main(string[] args) { int n = 4000000; var answer = FibonacciNumbers(n - 1) .Where(i => i%2 == 0) .Sum(); Console.WriteLine(answer); Console.ReadLine(); } static IEnumerable<int> FibonacciNumbers(int max) { foreach (var i in FibonacciNumbers()) { if (max < i) yield break; yield return i; } } static IEnumerable<int> FibonacciNumbers() { var previous = 0; var current = 1; var next = 0; while (true) { next = previous + current; yield return next; previous = current; current = next; } }
解説
問題を解くだけならもっとシンプルになるんですが、LINQっぽく(?)処理しようと思いました。
フィボナッチ数の無限シーケンスを返すメソッドを作って、最大値でブレークするオーバロードを用意。これで Where, Sum メソッドで簡単に処理できます。