首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回C#中偶数斐波那契数的列表

返回C#中偶数斐波那契数的列表
EN

Stack Overflow用户
提问于 2017-07-10 20:11:12
回答 3查看 1.6K关注 0票数 0

我正在解决Euler项目页面上的问题2

Fibonacci序列中的每个新项都是通过添加前两个项来生成的。从1和2开始,前10项将是:1、2、3、5、8、13、21、34、55、89、.通过考虑Fibonacci序列中值不超过400万的项,找出偶数项的和。

在我把所有偶数加起来之前,我想要生成一个它们的列表。

我创建了以下方法:

代码语言:javascript
运行
复制
    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;
        }

    }

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

代码语言:javascript
运行
复制
    static void Main(string[] args)
    {
        var List = ListEvenFibonacci(15);
        for (int i = 0; i < List.Count; i++)
        {
            Console.WriteLine(List[i]);
        }
    }

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

代码语言:javascript
运行
复制
2
5
8
11
14
EN

回答 3

Stack Overflow用户

发布于 2017-07-10 20:17:10

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

代码语言:javascript
运行
复制
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; 
  } 
}

..。

代码语言:javascript
运行
复制
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

票数 2
EN

Stack Overflow用户

发布于 2017-07-10 20:14:25

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

代码语言:javascript
运行
复制
evenList.Add(i);

应该是

代码语言:javascript
运行
复制
 evenList.Add(list[i]);
票数 1
EN

Stack Overflow用户

发布于 2017-07-10 20:30:25

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

代码语言:javascript
运行
复制
for (int i = 0; i < list.Count; i++)
{
    if (IsEvan(list.ElementAt(i)))
        evenList.Add(list.ElementAt(i));
}

关于偶数之和

代码语言:javascript
运行
复制
int sum = 0;
for (int i = 0; i < List.Count; i++)
    sum += List[i];
Console.WriteLine(sum); // this will print sum of even number.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45020774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档