Я знаю, что это старый вопрос, но я работал над той же проблемой сегодня и пришел к этому краткому функциональному решению со временем выполнения O (n):
static int FibTotal(int limit, Func<int, bool> include, int last = 0, int current = 1)
{
if (current < limit)
return FibTotal(limit, include, current, last + current) +
(include(current) ? current : 0);
else
return 0;
}
Вы также можете получить хорошее однострочное решение, если сначала определите этот удобный класс (возможно, что-то подобное уже существует в .NET Framework, но я не смог его найти):
public static class Sequence
{
public static IEnumerable<T> Generate<T>(T seed, Func<T, T> next)
{
while (true)
{
yield return seed;
seed = next(seed);
}
}
}
Решение тогда становится:
var result = Sequence.Generate(Tuple.Create(1, 1),
t => Tuple.Create(t.Item2, t.Item1 + t.Item2))
.Select(t => t.Item1)
.TakeWhile(i => i < 4000000)
.Where(i=> i % 2 == 0)
.Sum();