2010-11-07 3 views
1
séquence de Fibonacci

je tente de résoudre le second problème sur le projet Euler, est le problème ici:C# réplication

Chaque nouveau terme dans la séquence de Fibonacci est généré en ajoutant les deux termes précédents. En commençant par 1 et 2, les 10 premiers termes sont les suivants:

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

Trouver la somme de toutes les termes pairs dans la séquence qui ne dépassent pas quatre millions.

Alors, je l'ai mis en place les suivantes:

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

Quand je lance le programme, il n'y a rien de visible, juste un curseur dans la ligne de commande Windows. Je pense que cela pourrait être le fait que currentNumber n'est pas mis à jour, mais je ne peux pas penser à la façon de le faire correctement, si c'est le cas.

Répondre

4

Vous n'avez pas de condition pour terminer votre boucle. Vous ne jamais changer la valeur de currentNumber à quoi que ce soit, mais 1.

Vous voulez probablement quelque chose comme:

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

Non, ce n'est pas mis à jour, et vous avez une boucle infinie.

Une façon plus simple de penser à la séquence de Fibbonacci est que la valeur suivante est la somme des deux valeurs précédentes.

Ie.

0 1. Suivant est 1 suivante est 2 (1 + 1) suivant est 3 (1 + 2) suivante est 5 (2 + 5)

donc garder une trace des deux dernières valeurs, et utilisez-le pour créer la prochaine valeur.

3

Vous avez raison, le problème vient du fait que currentNumber n'est jamais mis à jour. Regardez la séquence de Fibonacci à nouveau:

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

Et dans la prochaine itération:

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

Notez que les variables sont décalées d'une position vers la droite et le nombre le plus ancien est mis au rebut. Donc, vous devez faire quelque chose comme ceci:

nextNumber = currentNumber + oldNumber; 
oldNumber = currentNumber; 
currentNumber = nextNumber; 
2
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(); 
     } 
    } 
} 
2
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; 
      } 
     }