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.