Bestimmen, ob eine Zahl eine Fibonacci-Zahl ist

7

Ich muss einen Java-Code schreiben, der überprüft, ob die eingegebene Nummer des Benutzers in der Fibonacci-Sequenz ist.

Ich habe kein Problem beim Schreiben der Fibonacci-Sequenz zur Ausgabe, aber (wahrscheinlich weil es spät in der Nacht ist) Ich habe Mühe, an die Reihenfolge zu denken, ob es eine Fibonacci-Zahl ist. Ich fange immer wieder an zu beginnen. Es macht wirklich meinen Kopf.

Was ich momentan habe, ist der n-te.

%Vor%     
Emily 29.06.2010, 10:05
quelle

14 Antworten

28

Lesen Sie den Abschnitt "Erkennen von Fibonacci-Zahlen" auf wikipedia .

  

Alternativ ist eine positive ganze Zahl z genau dann eine Fibonacci-Zahl, wenn eine von 5z ^ 2 + 4 oder 5z ^ 2 - 4 ein perfektes Quadrat ist. [17]

Alternativ können Sie weiterhin Fibonacci-Zahlen erzeugen, bis eine Ihrer Zahlen entspricht: Wenn dies der Fall ist, ist Ihre Nummer eine Fibonacci-Nummer. Wenn nicht, werden die Zahlen eventuell größer als Ihre Zahl und Sie können aufhören. Dies ist jedoch ziemlich ineffizient.

    
IVlad 29.06.2010 10:11
quelle
10

Wenn ich richtig verstehe, was Sie tun müssen (anstatt die ersten n Fibonacci-Zahlen auszugeben), müssen Sie bestimmen, ob n eine Fibonacci-Zahl ist.

Sie sollten also Ihre Methode so ändern, dass die Fibonacci-Folge solange erzeugt wird, bis Sie eine Zahl & gt; = n erhalten. Wenn es gleich ist, ist n eine Fibonacci-Zahl, andernfalls nicht.

Update: Von @ Morons wiederholten Behauptungen über den formelbasierten Algorithmus, der in der Leistung dem oben genannten überlegen ist, habe ich einen Benchmark-Vergleich gemacht - konkret zwischen Jacopos Lösung als Generatoralgorithmus und StevenHs letzte Version als formelbasierter Algorithmus . Als Referenz finden Sie hier den genauen Code:

%Vor%

Die Ergebnisse haben mich selbst überrascht:

%Vor%

Kurz gesagt, der Generator-Algorithmus übertrifft die formelbasierte Lösung bei allen positiven int-Werten - sogar nahe dem maximalen int-Wert ist er mehr als doppelt so schnell! So viel zur glaubensbasierten Leistungsoptimierung ;-)

Wenn der obige Code geändert wird, um long Variablen statt int zu verwenden, wird der Generatoralgorithmus langsamer (wie erwartet, da er jetzt long Werte addieren muss), und der Übergabepunkt ist der Formel beginnt schneller zu sein ist etwa 1000000000000L, dh 10 12 .

Update2: Wie IVlad und Moron schon gesagt haben, bin ich kein Experte in Fließkomma-Berechnungen :-) Aufgrund ihrer Vorschläge habe ich die Formel dahingehend verbessert:

%Vor%

Dies hat den Übergabepunkt auf ca. 10 8 (für die long version - der Generator mit int ist immer noch schneller für alle int-Werte). Kein Zweifel, dass das Ersetzen der Aufrufe von sqrt durch etwas, wie es von @Moron vorgeschlagen wird, den Übergabepunkt weiter nach unten drücken würde.

Mein (und Ivlads) Punkt war einfach, dass es immer einen Wendepunkt geben wird, unter dem der Generator-Algorithmus schneller ist. Behauptungen, welche besser sind, haben keine Bedeutung im Allgemeinen, nur in einem Kontext.

    
Péter Török 29.06.2010 10:11
quelle
6

Anstatt den Index n zu übergeben, schreibe eine Funktion, die ein Limit akzeptiert, und erhalte die Fibonacci-Zahlen bis zu und einschließlich dieses Limits. Lassen Sie sie einen Booleschen Wert zurückgeben, je nachdem, ob sie das Limit erreicht oder überspringt, und Sie können dies verwenden, um zu überprüfen, ob dieser Wert in der Sequenz enthalten ist.

Da es sich um Hausaufgaben handelt, ist ein solcher Anstoß wahrscheinlich alles, was wir Ihnen geben sollten ...

    
David M 29.06.2010 10:08
quelle
3

Ok. Da die Leute behaupteten, ich spreche nur dünne Luft ("Fakten" oder "Vermutungen") ohne Daten, um dies zu untermauern, schrieb ich einen eigenen Benchmark.

Nicht Java, aber C # -Code unten.

%Vor%

Und hier ist die Ausgabe

%Vor%

Die Methode sqrt schlägt die naive Methode, wenn n = 50 ist, vielleicht aufgrund der Hardwareunterstützung auf meinem Rechner. Selbst wenn es 10 ^ 8 (wie in Peters Test) war, gibt es höchstens 40 Fibonacci-Zahlen unter diesem Cutoff, die leicht in eine Nachschlagetabelle gelegt werden können und die naive Version für die kleineren Werte schlagen.

Auch Peter hat eine schlechte Implementierung der SqrtVersion. Er braucht nicht wirklich zwei Quadratwurzeln zu berechnen oder Energien mit Math.Pow zu berechnen. Er hätte zumindest versuchen können, das besser zu machen, bevor er seine Benchmark-Ergebnisse veröffentlichte.

Auf jeden Fall werde ich diese Fakten für sich sprechen lassen, anstelle der sogenannten "Vermutungen".

    
Aryabhatta 01.07.2010 21:40
quelle
2

Eine positive ganze Zahl x ist eine Fibonacci-Zahl genau dann, wenn eines von 5x ^ 2 + 4 und 5x ^ 2 - 4 ein perfektes Quadrat ist

    
Soufiane Hassou 29.06.2010 10:12
quelle
2

Es gibt eine Reihe von Methoden, die verwendet werden können, um zu bestimmen, ob eine gegebene Zahl in der Fibonacci-Sequenz ist, von der eine Auswahl auf wikipedia .

In Anbetracht dessen, was Sie bereits getan haben, würde ich wahrscheinlich einen Brute-Force-Ansatz wie den folgenden verwenden:

  1. Erzeuge eine Fibonacci-Nummer
  2. Wenn es weniger als die Zielnummer ist, generiere das nächste Fibonacci und wiederhole
  3. Wenn es die Zielnummer ist, dann Erfolg
  4. Wenn es größer ist als die Zielnummer, dann failure.

Ich würde wahrscheinlich eine rekursive Methode verwenden, die einen aktuellen n-Wert (dh so, dass sie die n-te Fibonacci-Zahl berechnet) und die Zielnummer eingibt.

    
Edd 29.06.2010 10:24
quelle
2
%Vor%     
Nithya 07.06.2013 16:37
quelle
1

Wenn mein Java nicht zu rostig ist ...

%Vor%     
Iacopo 29.06.2010 10:16
quelle
1

Der Versuch, den Code nutzen Sie bereits geschrieben haben ich die folgenden ersten würde vorschlagen, wie es die einfachste Lösung ist (aber nicht die effizienteste):

%Vor%

Ich würde eine elegantere Lösung bei der Erzeugung von Fibonacci-Zahlen vorzuschlagen, das Rekursion nutzt etwa so:

%Vor%

Für die zusätzlichen Kredit lesen: Ссылка

Sie werden sehen, dass es ein paar effizientere Möglichkeiten gibt, zu testen, ob eine Zahl in der Fibonacci-Reihe ist: (5z ^ 2 + 4 oder 5z ^ 2 - 4) = ein Perfekt Platz.

%Vor%     
holsee 29.06.2010 10:24
quelle
0

Ich weiß nicht, ob es eine tatsächliche Formel gibt, die Sie auf die Benutzereingabe anwenden können, aber Sie können die Fibonacci-Sequenz erzeugen und gegen die Benutzereingabe überprüfen, bis sie kleiner als die letzte generierte Zahl ist.

%Vor%     
Chris J 29.06.2010 10:13
quelle
0

Sie können dies auf zwei Arten tun, die rekursive und mathematische. der rekursive Weg  fange an, eine Fibonacci-Sequenz zu generieren, bis du die Zahl triffst oder sie passierst die mathematische Art, die hier schön beschrieben wird ... Ссылка

viel Glück.

    
Stas 29.06.2010 11:44
quelle
0

Man betrachte die Reihenfolge der Fibonacci-Zahlen 1,1,2,3,5,8,13,21 usw. Es ist wünschenswert, 3 Stapel mit der Kapazität 10, die Zahlen aus den obigen Sequenzen enthalten, wie folgt aufzubauen:

Stapel 1: Die ersten 10 Zahlen aus der Sequenz. Stack 2: Die ersten 10 Primzahlen aus der Sequenz. Stapel 3: Die ersten 10 Nicht-Primzahlen aus der Sequenz.

(i) Geben Sie einen Algorithmus des Flussdiagramms an (ii) Schreiben Sie ein Programm (in BASIC, C ++ oder Java), um dies zu implementieren.

Ausgabe: Wenn Stapeloperationen stattfinden, sollten Sie die drei Stapel zusammen mit den darin enthaltenen Werten in einer beliebigen geeigneten Form anzeigen.

    
Seidu Lukman Lutie 20.09.2013 12:01
quelle
0

Finden Sie heraus, ob eine Zahl Fibonacci ist, basierend auf der Formel:

%Vor%     
realPK 28.07.2016 22:15
quelle
0

Dachte, es wäre einfach, bis ich mir ein paar Minuten den Kopf darüber legen musste. Es ist ganz anders als eine Fibonacci-Sequenz zu erzeugen. Diese Funktion gibt 1 zurück, wenn Fibonnaci ist oder 0 wenn nicht

%Vor%     
karto 03.11.2017 00:39
quelle

Tags und Links