Algorithmusfunktion für Fibonacci-Serie [geschlossen]

7

Ich suche nicht unbedingt nach einer Antwort, aber ich suche nach dem, was diese Frage verlangt. Haben Sie diese Frage für ein Interview gefunden, aber nicht sicher, was sie fragen?

  

Schreib-Funktion, die die Fibonacci-Sequenz durchläuft und zurückgibt   der Index, der als Parameter übergeben wird.

    
KingKongFrog 05.05.2013, 20:46
quelle

5 Antworten

28

Erstens können Sie Ihre mathematischen Basisinformationen über Fibonacci mit diesem Link aus dem Wiki aktualisieren. und sieh dir diese Formel an, um schnell zu berechnen. Und du kannst alles darüber in diesen Link .

Dies ist eine rekursive Funktion, um die n-te Fibonacci-Zahl zu berechnen und hat die Zeit O (2 ^ n):

%Vor%
  

Berechnen der Sequenz

     

Sie könnten argumentieren, dass in Bezug auf die tatsächliche Berechnung der Werte der   Fibonacci Sequenz auf einem Computer, Sie sind besser dran mit dem Original   Wiederholungsbeziehung, f [n] = f [n-1] + f [n-2]. Ich bin geneigt zuzustimmen. Benutzen   die direkte geschlossene Lösung für große n, müssen Sie ein beibehalten   viel Präzision. Selbst mit 9 Nachkommastellen,   fn≈round (0.723606798⋅ (1,618033989) n) ist beispielsweise nur gültig für   bis zu n = 38 (beobachten Sie hier gegen hier ). Auch das Addieren von ganzen Zahlen ist viel   weniger rechenintensiv und genauer als potenzieren a   Symbolischer Bruch oder ein Fließkommawert

Das ist die bessere Idee, die n-te Fibonacci-Zahl zu berechnen und ist von O (n) Zeit:

%Vor%

und dies ist der beste Weg, die n-te Fibonacci-Zahl zu berechnen und ist von O (log (n)) Zeit:

dieser Link:

Wie Sie bereits vermuten, funktioniert das sehr ähnlich. Verwenden Sie die n-te Potenz der x * x -Matrix

%Vor%

Das ist leicht zu verstehen, wenn Sie diese Matrix mit dem Vektor

multiplizieren %Vor%

was zu

führt %Vor%

Die Matrix-Potenzierung kann in der Zeit O (log (n)) erfolgen (wenn x als konstant betrachtet wird).

Für die Fibonacci-Wiederholung gibt es auch eine geschlossene Formellösung, siehe hier Ссылка , suche nach Binets oder Moivres Formel .

und schau dir an: 1- n-te Fibonacci-Nummer in der sublinearen Zeit

    
amin k 05.05.2013 21:15
quelle
13

Was mir scheint ist, dass Sie gebeten werden, die n-te Fibonacci-Nr. zurückzugeben, wobei n der übergebene Parameter ist. Sie können verschiedene Methoden anwenden, um diese Frage zu beantworten, während all diese Unterschiede in der zeitlichen Komplexität und Komplexität des Codes variieren.

Methode 1 (Rekursion verwenden) Eine einfache Methode, bei der es sich um eine direkte rekursive Implementierung der mathematischen Rekursionsrelation handelt.

%Vor%

Zeitkomplexität: T (n) = T (n-1) + T (n-2) was exponentiell ist. Wir können beobachten, dass diese Implementierung viele wiederholte Arbeiten ausführt (siehe den folgenden Rekursionsbaum). Das ist also eine schlechte Implementierung für die n-te Fibonacci-Nummer.

%Vor%

fib (2) fib (1) fib (1) fib (0) fib (1) fib (0)   / \ fib (1) fib (0) Extra Space: O (n), wenn wir die Größe des Aufrufs des Function Calls betrachten, ansonsten O (1).

Methode 2 (Verwenden Sie die dynamische Programmierung) Wir können die wiederholte Arbeit vermeiden, die Methode 1 durch Speichern der Fibonacci-Zahlen, die bisher berechnet wurden.

%Vor%

Zeitkomplexität: O (n) Extra Leerzeichen: O (n)

Methode 3 (raumoptimierte Methode 2) Wir können den in Methode 2 verwendeten Speicherplatz optimieren, indem wir die vorherigen zwei Zahlen nur speichern, weil wir damit nicht mehr die nächste Fibannaci-Nummer in Reihe bringen können.

%Vor%

Zeitkomplexität: O (n) Extra Platz: O (1)

Methode 4 (Verwendung der Potenz der Matrix {{1,1}, {0,1}}) Dieses andere O (n) beruht auf der Tatsache, dass, wenn wir n multiplizieren die Matrix M = {{1,1}, {0,1}} zu sich selbst (mit anderen Worten Macht (M, n) berechnen), dann Wir erhalten die (n + 1) te Fibonacci-Zahl als Element in Zeile und Spalte (0, 0) in der resultierenden Matrix.

Die Matrixdarstellung gibt den folgenden geschlossenen Ausdruck für die Fibonacci-Zahlen:

%Vor%

Zeitkomplexität: O (n) Extra Platz: O (1)

Methode 5 (Optimierte Methode 4) Das Verfahren 4 kann optimiert werden, um in der Zeitkomplexität O (Logn) zu arbeiten. Wir können eine rekursive Multiplikation durchführen, um Leistung (M, n) in der Prevous-Methode zu erhalten (ähnlich wie in diesem Post)

%Vor%

Zeitkomplexität: O (Logn) Extra Space: O (Logn) wenn wir die Größe des Funktionsaufrufstapels betrachten, sonst O (1).

Treiberprogramm:     int Haupt ()     {       int n = 9;       printf ("% d", fib (9));       getchar ();       zurückgeben 0;     }

Referenzen: Ссылка Ссылка

    
Aman Chhabra 06.05.2013 21:10
quelle
2

Es ist eine sehr schlecht formulierte Frage, aber Sie müssen annehmen, dass sie nach der n th Fibonnaci-Zahl fragen, wobei n als Parameter zur Verfügung gestellt wird.

Zusätzlich zu allen von anderen aufgelisteten Techniken können Sie für n > 1 auch die Methode Golden Ratio , die schneller als jede iterative Methode ist. Aber wie die Frage sagt "lauf durch die Fibonacci-Sequenz" kann dies nicht qualifizieren. Sie würden sie wahrscheinlich auch zu Tode erschrecken.

    
EJP 07.05.2013 02:32
quelle
0
%Vor%     
Dima 05.05.2013 21:19
quelle
0

Ich interpretiere die Frage anders ... bei einem number als Eingabe, was ist der index dieser Zahl in der Serie? z.B. input=5 , dann ist der Index 5 (bei der Sequenz ist 0 1 1 2 3 5 , wobei der Index mit 0 beginnt)

Dies ist der folgende Code (der den Index zurückgibt) [Haftungsausschluss: Angepasst von dem Code, der in Ссылка angegeben wurde ]

%Vor%     
Bill 05.05.2013 21:53
quelle

Tags und Links