Frage

Ich übe eine C # Konsolenanwendung, und ich versuche, um die Funktion zu erhalten, um zu überprüfen, ob die Anzahl in einer Fibonacci-Reihe erscheint oder nicht, aber ich bin immer Fehler.

Was ich tat, war:

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

Kann mir jemand sagen, was ich falsch hier?

War es hilfreich?

Lösung

Und hier ist eine Lösung, die alle von Ihnen schlägt!

Weil, warum Iteration , wenn Sie klug haben Mathematiker tun geschlossene Lösungen für Sie? :)

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

Andere Tipps

Hier ist ein Spaß-Lösung eine unendliche Iteratorblock mit:

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

ich wirklich wirklich wie diese Art von Fibonacci-Implementierung gegen die Tradition rekursive Lösung, weil sie die Arbeit halten verwendet, um einen Begriff zur Verfügung füllen Sie die nächsten abzuschließen. Die traditionelle rekursive Lösung dupliziert einige Arbeit, denn es braucht zwei rekursiven Aufrufe jeden Begriff.

Das Problem liegt in <= die folgende Anweisung:

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

mehr auf den Punkt der =. Es gibt keine fib [100] (C # Null zählt) so, wenn Sie auf i überprüfen = 100 Sie eine Ausnahme erhalten.

die richtige Anweisung sollte

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

oder noch besser

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

Nun, für den Anfang Ihres Array ist nur 10 lang und Sie füllen es mit ~ 100 Artikeln (out-of-range-Ausnahme) - aber es gibt bessere Möglichkeiten, dies zu tun ...

zum Beispiel unter Verwendung von Beitrag :

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

Sie werden außerhalb der Grenzen des Arrays, weil Ihre Schleife bedingt zu groß ist. Ein traditioneller Ansatz würde durch die Größe des Arrays der Schleife gebunden sein:

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

Und machen Sie Ihre Array größer, aber wie Marc sagte, es gibt bessere Möglichkeiten, dies zu tun, und ich würde Ihnen raten, verbringen einige Zeit auf der Wikipedia-Artikel lesen Fibonacci-Zahlen .

Eine Sache, die Sie tun können, ist für einen frühzeitigen Ausstieg zu prüfen. Da Sie, wenn eine bestimmte Anzahl in der Fibonacci-Sequenz bestimmen mögen, ist, können Sie die Überprüfung Grenzen früh zu beenden.

Beispiel:

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;

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top