C#斐波那契数列

C# fibbonacci numbers

有些人可能熟悉 ProjectEuler; website/community 包含一系列基于逻辑数字的谜题,可以通过使用代码来解决。 他们有一个问题阅读 "By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms" 我生成了以下代码作为解决方案

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

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

您的解决方案存在两个问题。首先,您将两个项都从 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;
}

但我是这样解决同样问题的。请注意,这为您提供了一种可重复用于其他欧拉问题的方法。另请注意,我没有使用临时变量,而是将前一项添加到当前项以获得下一项,然后从当前项中减去前一项将得到当前值,然后再将前一项添加到它。

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();