問題
偶数のフィボナッチ数
フィボナッチ数列の項は前の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 メソッドで簡単に処理できます。