Question

Je pratiquais une application console C #, et je suis en train d'obtenir la fonction de vérifier si le numéro apparaît dans une série de fibonacci ou non, mais je reçois des erreurs.

Ce que je l'ai été:

class Program
{
    static void Main(string[] args)
    {
        System.Console.WriteLine(isFibonacci(20));
    }
    static int isFibonacci(int n)
    {
        int[] fib = new int[100];
        fib[0] = 1;
        fib[1] = 1;
        for (int i = 2; i <= 100; i++)
        {
            fib[i] = fib[i - 1] + fib[i - 2];

            if (n == fib[i])
            {
                return 1;
            }



        }
        return 0;
    }
}

Quelqu'un peut-il me dire ce que je fais mal ici?

Était-ce utile?

La solution

Et voici une solution qui bat tous les vôtres!

Parce que, pourquoi itération lorsque vous avez intelligents mathématiciens font solutions de forme fermée pour vous? :)

static bool IsFibonacci(int number)
{
    //Uses a closed form solution for the fibonacci number calculation.
    //http://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression

    double fi = (1 + Math.Sqrt(5)) / 2.0; //Golden ratio
    int n = (int) Math.Floor(Math.Log(number * Math.Sqrt(5) + 0.5, fi)); //Find's the index (n) of the given number in the fibonacci sequence

    int actualFibonacciNumber = (int)Math.Floor(Math.Pow(fi, n) / Math.Sqrt(5) + 0.5); //Finds the actual number corresponding to given index (n)

    return actualFibonacciNumber == number;
}

Autres conseils

Voici une solution amusante en utilisant un bloc itérateur infini:

IEnumerable<int> Fibonacci()
{
   int n1 = 0;
   int n2 = 1;

   yield return 1;
   while (true)
   {
      int n = n1 + n2;
      n1 = n2;
      n2 = n;
      yield return n;
   }
}

bool isFibonacci(int n)
{
    foreach (int f in Fibonacci())
    {
       if (f > n) return false;
       if (f == n) return true;
    }
}

En fait, je aime vraiment ce genre de mise en œuvre de Fibonacci vs la tradition solution récurrente, car elle conserve le travail utilisé pour compléter un terme disponible pour compléter la prochaine. La solution récursive traditionnelle fait double emploi avec un peu de travail, car il a besoin de deux appels récursifs chaque terme.

Le problème réside dans <= l'instruction suivante:

for (int i = 2; i <= 100; i++)

plus au point les =. Il n'y a pas fib [100] (C # zéro compte) donc quand vous vérifiez i = 100 vous obtenez une exception.

la déclaration appropriée doit être

for (int i = 2; i < 100; i++)

ou mieux encore

for (int i = 2; i < fib.Length; i++)

Eh bien, pour commencer votre tableau est seulement 10 long et vous remplissez avec environ 100 articles (hors gamme exception) - mais il y a de meilleures façons de le faire ...

par exemple, en utilisant ce post :

long val = ...
bool isFib = Fibonacci().TakeWhile(x => x <= val).Last() == val;
int[] fib = new int[10];
for (int i = 2; i <= *100*; i++)

Vous sortez des limites de votre tableau parce que votre boucle conditionnelle est trop grande. Une approche plus traditionnelle serait lié par la boucle de la taille du tableau:

for (int i = 2; i < fib.Length; i++)

Et faire votre choix plus grand, mais comme Marc dit, il y a de meilleures façons de le faire, et je vous conseille de passer un peu de temps à lire l'article de wikipedia sur les nombres de Fibonacci .

Une chose que vous pouvez faire est de vérifier pour une sortie précoce. Puisque vous essayez de déterminer si un nombre donné est dans la suite de Fibonacci, vous pouvez vérifier les limites pour quitter tôt.

Exemple:

static bool isFibonacci(int n)
{
    int[] fib = new int[100];
    fib[0] = 1;
    fib[1] = 1;
    for (int i = 2; i <= fib.Length; i++)
    {
        fib[i] = fib[i - 1] + fib[i - 2];

        if (n == fib[i])
        {
            return true;
        }
        else if (n < fib[i])
        {
            return false;  //your number has been surpassed in the fib seq
        }
    }
    return false;
}
public static int FibNo(int n) {
    int result = 0; int No = 0; int N1 = 1;

    if (n< 0)
    { throw new ArguementException("number must be a positive value"); }

    if (n <= 1) 
    { result = n; return result; }

    for(int x=1; x < n; x++) 
    { result = No + N1; No = N1; N1=result; }

    return result;

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top