C # репликация последовательности Фибоначчи - PullRequest
1 голос
/ 07 ноября 2010

Я пытаюсь решить вторую проблему в 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 не обновляется, но я не могу придумать, как это сделать правильно, даже если это так.

Ответы [ 5 ]

4 голосов
/ 07 ноября 2010

У вас нет условия для завершения цикла. Вы никогда не меняете значение currentNumber ни на что, кроме 1.

Вы, вероятно, хотите что-то вроде:

nextNumber = currentNumber + oldNumber;
oldNumber = currentNumber;
currentNumber = nextNumber;
3 голосов
/ 07 ноября 2010

Вы правы в том, что проблема в том, что 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;
2 голосов
/ 07 ноября 2010
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;
            }
        }
2 голосов
/ 07 ноября 2010
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();
        }
    }
}
1 голос
/ 07 ноября 2010

Нет, оно не обновляется, и у вас бесконечный цикл.

Более простой способ представить последовательность Фиббоначи, это следующее значение является суммой двух предыдущих значений.

Т.е.

0 1. Далее 1 Далее 2 (1 + 1) Далее 3 (1 + 2) Далее 5 (2 + 5)

Так что следите за последними двумя значениями и используйте его для создания следующего значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...