C#fibbonacci数字

时间:2016-05-10 12:07:02

标签: c# oop logic iteration fibonacci

有些人可能熟悉ProjectEuler;一个网站/社区,其中包含一系列基于逻辑数字的谜题,可以通过使用代码来解决。 他们有一个问题“通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和” 我生成了以下代码作为解决方案

    int firstNumber = 0;
    int Total = 0;
    for (int fib = 0; fib < 4000000; fib+=firstNumber)
     {
          firstNumber += fib;
          if (fib % 2 == 0)
          {
           total += fib
          }
     }

我试过的IDE无法执行此操作。我几乎是全新的编程,我在学校所做的课程直接从面向对象编程开始,所以我没有太多的计算机科学背景继续下去。正如您所看到的,理论上我提供的代码应该将增量更改为前一个值,因此创建斐波纳契序列,并将每个偶数添加到总数中应该为我提供答案,对吧? 从逻辑上讲,这似乎是合适的,但我离软件工程师很远,我真的不知道自己在做什么。 所以,我想我的问题是,我的代码究竟出了什么问题以及你如何处理问题的解决方案? 谢谢,亚当。

1 个答案:

答案 0 :(得分:2)

您的解决方案存在两个问题。首先,你在0处开始这两个项,并且将0添加到0只得到0.你应该从1开始。其次,您当前的字词在fibfirstNumber之间交替。您需要一个临时值来将两者的总和放入,然后将firstNubmer设置为fib,然后将fib设置为临时值。所以,你真的可以使用while循环代替。

int firstNumber = 1;
int fib = 1;
int Total = 0;
while(fib < 4000000)
{
    if (fib % 2 == 0)
    {
        total += fib;
    }

    int temp = firstNumber + fib;
    firstNumber = fib;
    fib = temp;
}

但这是我如何解决同样的问题。请注意,这为您提供了一种可以重用于其他Euler问题的方法。另请注意,我不是使用临时变量,而是将前一个术语添加到当前值以获取下一个,然后从当前值中减去前一个值将导致在添加前一个值之前的当前值。

public static IEnumerable<long> FibSeries()
{
    yield return 1;
    long previous = 1;
    long current = 1;
    while (true)
    {
        yield return current;
        current += previous;
        previous = current - previous;
    }
}

然后你可以用Linq解决它

long sum = FibSeries().TakeWhile(f => f < 4000000).Where(f => f % 2 == 0).Sum();