2009-07-02 4 views
2

Ich übe eine C# -Konsolenanwendung, und ich versuche, die Funktion zu überprüfen, ob die Nummer in einer Fibonacci-Serie oder nicht erscheint, aber ich bekomme Fehler.C# Fibonacci-Funktion Fehler zurück

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 hier falsch mache?

+1

definieren "Fehler" ... –

+0

Meinen Sie #DEFINE Fehler? – Jonathan

+2

Nur neugierig, aber warum gibst du eher einen Int als einen Bool zurück? – Joel

Antwort

5

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

Weil, warum Iteration wenn man intelligente 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; 
} 
4

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

für Beispiel mit this post:

long val = ... 
bool isFib = Fibonacci().TakeWhile(x => x <= val).Last() == val; 
+0

Ah, du hast mich geschlagen! – Joseph

+0

oh sorry guys meine schlechte, es war ein Tippfehler, aber das ist nicht das Problem ... – jarus

2

eine Sache, die Sie für einen frühzeitigen Ausstieg prüfen tun können. Da Sie versuchen zu bestimmen, ob eine bestimmte Zahl in der Fibonacci-Sequenz enthalten ist, können Sie die Zeitlimitüberprüfung aktivieren, um vorzeitig 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; 
} 
+1

Wahrscheinlich sollte eine Ausnahme auslösen, wenn das Ende des Arrays erfüllt ist: Funktion kann in diesem Fall keine Antwort geben. – Richard

2
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, einige verbringen Zeit lesen Sie den Wikipedia-Artikel auf Fibonacci numbers.

18

ist hier eine 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 mag diese Art von Fibonacci-Implementierung gegen die Tradition rekursive Lösung, weil es die Arbeit verwendet hält zur Verfügung, einen Begriff zu vervollständigen die abzuschließen Nächster. Die traditionelle rekursive Lösung kopiert einige Arbeiten, weil sie für jeden Ausdruck zwei rekursive Aufrufe benötigt.

9

Das Problem liegt in < = die folgende Aussage:

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

mehr auf den Punkt die =. Es gibt keine fib [100] (C# null zählt), wenn Sie also auf i = 100 setzen, erhalten Sie eine Ausnahme.

sollte die richtige Aussage

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

oder noch besser

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

+1 Ich bin erstaunt, dass die höchste Antwort und akzeptierte Antwort nicht auf den Grund des Fehlers hinweisen. ** Dies ist das eigentliche Problem mit seinem Code. ** Er bekommt ** Index out of range exception ** wegen Zugriff auf 'fib [100]', während das letzte Element 'fib [99]' ist. –

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

}