【问题标题】:C# Fibonacci Sequence ReplicationC# 斐波那契数列复制
【发布时间】:2011-05-06 04:47:22
【问题描述】:

我正在尝试解决 Project Euler 的第二个问题,问题是:

斐波那契数列中的每个新项都是通过添加前两项来生成的。从 1 和 2 开始,前 10 个术语将是:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

求序列中所有不超过四百万的偶数项之和。

所以,我设置了以下内容:

using System;

namespace ProjectEuler
{
    class Question2
    {
        //Project Euler - Question 2
        //Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
        //1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
        //Find the sum of all the even-valued terms in the sequence which do not exceed four million
        static void Main()
        {
            int sum = 0;

            int oldNumber = 1;
            int currentNumber = 1;
            int nextNumber;

            while (currentNumber <= 500)
            {
                nextNumber = currentNumber + oldNumber;

                if (nextNumber % 2 == 0)
                {
                    sum += currentNumber;
                }
            }

            Console.WriteLine("Project Euler - Question 2\n\nAnswer: " + sum);
            Console.ReadLine();
        }
    }
}

当我运行程序时,没有任何可见的东西,只是 Windows 命令行中的一个光标。我认为这可能是因为 currentNumber 没有得到更新,但我想不出如何正确地做到这一点,即使是这样。

【问题讨论】:

    标签: c# if-statement while-loop


    【解决方案1】:

    您没有结束循环的条件。您永远不会将 currentNumber 的值更改为 1。

    你可能想要这样的东西:

    nextNumber = currentNumber + oldNumber;
    oldNumber = currentNumber;
    currentNumber = nextNumber;
    

    【讨论】:

      【解决方案2】:

      不,它没有被更新,你有一个无限循环。

      考虑斐波那契数列的一种更简单的方法是,下一个值是前两个值的总和。

      即。

      0 1. 接下来是 1 接下来是 2 (1+1) 接下来是 3 (1+2) 接下来是5(2+5)

      因此,请跟踪最后两个值,并使用它来创建下一个值。

      【讨论】:

        【解决方案3】:

        您说得对,因为currentNumber 从未更新过。再看斐波那契数列:

        F(n+2) = F(n+1) + F(n)
                 ^ currentNumber
        ^ nextNumber      ^ oldNumber
        

        在下一次迭代中:

        F(n+3) = F(n+2) + F(n+1)
                 ^ currentNumber
        ^ nextNumber      ^ oldNumber
        

        请注意,变量向右移动了一个位置,并且最旧的数字被丢弃。所以你需要做这样的事情:

        nextNumber = currentNumber + oldNumber;
        oldNumber = currentNumber;
        currentNumber = nextNumber;
        

        【讨论】:

          【解决方案4】:
          using System;
          
          namespace ProjectEuler
          {
              class Question2
              {
                  //Project Euler - Question 2
                  //Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
                  //1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
                  //Find the sum of all the even-valued terms in the sequence which do not exceed four million
                  static void Main()
                  {
                      int sum = 0;
          
                      int currentNumber = 1;
                  int lastNumber = 0;
          
                      while (currentNumber <= 500)
                      {
                          if (currentNumber % 2 == 0)
                          {
                              sum += currentNumber;
                          }
          
                  int nextNumber = lastNumber + currentNumber;
                  lastNumber = currentNumber;
                  currentNumber = nextNumber;
                      }
          
                      Console.WriteLine("Project Euler - Question 2\n\nAnswer: " + sum);
                      Console.ReadLine();
                  }
              }
          }
          

          【讨论】:

            【解决方案5】:
            static void Main(string[] args)
                    {
                        var sum = 0;
                        foreach (var number in GetEvenFibonacciSeries())
                        {
                            if (sum + number > 4000000)
                                break;
            
                            sum += number;
                        }
            
                        Console.WriteLine(sum);
                    }
            
                    private static IEnumerable<int> GetEvenFibonacciSeries()
                    {
                        var first = 0;
                        var second = 1;
                        var next = 0;
                        while (true)
                        {
                            next = first + second;
                            first = second;
                            second = next;
                            if(next % 2 == 0)
                                yield return next;
                        }
                    }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-06-05
              • 2021-11-30
              • 2019-04-06
              • 2015-07-05
              • 1970-01-01
              相关资源
              最近更新 更多