在C#中返回偶数斐波纳契数列表

时间:2017-07-10 20:11:12

标签: c#

我正在通过Project Euler页面上的问题2工作

  

Fibonacci序列中的每个新术语都是通过添加   前两个任期。从1和2开始,前10个术语将   be:1,2,3,5,8,13,21,34,55,89,...考虑中的条款   发现,斐波那契序列的值不超过四百万   偶数项的总和。

在我总结所有偶数之前,我想生成一个列表。

我创建了以下方法:

    static List<int> Fibonacci(int n)
    {
        int a = 0;
        int b = 1;
        var list = new List<int>();

        for (int i = 0; i < n; i++)
        {
            int temp = a;
            a = b;
            b = temp + b;
            list.Add(a);
        }
        return list;
    }

    static List<int> ListEvenFibonacci(int n)
    {
        var list = Fibonacci(n);
        var evenList = new List<int>();

        for (int i = 0; i < list.Count; i++)
        {
            if (IsEvan(list.ElementAt(i)))
            {
                evenList.Add(i);
            }
        }

        return evenList;
    }

    static bool IsEvan(int n)
    {
        if (n % 2 == 0)
        {
            return true;
        }
        else
        {
            return false;
        }

    }

在我的主要功能中,我打印出偶数列表,以确保它的工作方式如下:

    static void Main(string[] args)
    {
        var List = ListEvenFibonacci(15);
        for (int i = 0; i < List.Count; i++)
        {
            Console.WriteLine(List[i]);
        }
    }

但是,我得到的输出不正确:

2
5
8
11
14

3 个答案:

答案 0 :(得分:2)

我建议实现生成器,然后在 Linq 的帮助下执行查询:

private static IEnumerable<long> Fibo(long first, long second) {
  long prior = first;
  long last = second;

  yield return prior; 
  yield return last; 

  while (true) {
    long next = prior + last;

    yield return next;

    prior = last;
    last = next; 
  } 
}

...

long result = Fibo(1, 2)
  //.Where((value, index) => index % 2 == 0) // if we want even indexes (zero based!)
  .Where(value => value % 2 == 0)            // if we want even values
  .TakeWhile(value => value <= 4000000)      // items not exceed 4e6
  .Sum(); 

Console.Write(result);

结果: 4613732

答案 1 :(得分:1)

您正在添加迭代变量,而不是列表元素本身。

evenList.Add(i);

应该是

 evenList.Add(list[i]);

答案 2 :(得分:0)

  

不保存偶数索引。将数字保存在这样的索引处。

for (int i = 0; i < list.Count; i++)
{
    if (IsEvan(list.ElementAt(i)))
        evenList.Add(list.ElementAt(i));
}
  

对于偶数值的总和

int sum = 0;
for (int i = 0; i < List.Count; i++)
    sum += List[i];
Console.WriteLine(sum); // this will print sum of even number.