So implementieren Sie die JavaScript-Ausgabe der Fibonacci-Folge

So implementieren Sie die JavaScript-Ausgabe der Fibonacci-Folge

Thema

Es gibt eine Frage, die wir beantworten müssen:

  • Versuchen Sie, die ersten 10 Terme der Fibonacci-Folge auszugeben, nämlich 1, 1, 2, 3, 5, 8, 13, 21, 34, 55.

analysieren

Manche Leute sind möglicherweise verwirrt, wenn sie das Konzept „Fibonacci-Folge“ im Titel sehen, aber das ist nicht nötig!

Bei dieser Frage können Sie dieses ungewohnte Konzept ignorieren. Wir müssen uns nur um das Zahlenmuster kümmern, das später angegeben wird.

Wir sehen, dass die Regel in einem Satz zusammengefasst werden kann: Ab der dritten Ziffer ist der Wert jedes nachfolgenden Terms gleich der Summe der beiden vorhergehenden Terme. In einer Formel ausgedrückt lautet dies: an = an-1 + an-2 (n ≥ 2).

Den Anforderungen des Themas entsprechend sind von uns eigentlich zwei Dinge gefragt:

  1. Generieren Sie den Wert jedes Artikels.
  2. Drucken Sie alle Werte aus.

Basislösung

Lösung:

  • Erstellen Sie ein Array, um die Werte jedes Elements in der Sequenz zu speichern.
  • Die For-Schleife generiert jedes Element der Sequenz, speichert es in einem Array (um die Werte der nachfolgenden Elemente zu berechnen) und druckt die generierten Elemente aus.

Der Code wird wie folgt implementiert:

/**
 * @description Erstellen Sie eine Methode zum Generieren eines Sequenz-Arrays. * @param {number} n gibt an, wie viele Elemente generiert werden sollen (d. h. die Array-Länge, nicht den Array-Index).
 */
Funktion erstelleFibArr(n) {
    //Deklarieren Sie ein Array zum Speichern von Daten let fibArr = [];
    // Beginnend mit dem dritten Element (Index 2) ist jedes Element gleich der Summe der beiden vorherigen Elemente for (let index = 0; index < n; index++) {
        Index < 2? fibArr.push(1) : fibArr.push(fibArr[Index - 1] + fibArr[Index - 2]);
        Konsole.log(fibArr[index]);
    }
}

//Methode createFibArr(10) aufrufen;

analysieren:

Dies dürfte die einfachste Methode zur Lösung des Problems sein und ist leicht umzusetzen.

Aber wenn es sich um eine Interviewfrage handelt, kann man eine solche Antwort nur als mittelmäßig bezeichnen, ohne irgendwelche Highlights. Vor allem spiegelt sie nicht unser einzigartiges Temperament wider. Deshalb sollten wir andere Mittel nutzen, um unseren eigenen Stil zu verbessern!

Grundlegende Rekursion

Lösung:

  • Der entsprechende Wert jeder Position wird durch Rekursion berechnet (hier gilt eine Prämisse: Das erste und das zweite Element sind feste Werte, andernfalls funktioniert die Rekursion nicht gut).
  • Drucken Sie die Ergebnisse aus.

Der Code wird wie folgt implementiert:

/**
 * @description Berechnen Sie den Wert des n-ten Elements. * @param {number} n stellt den Indexwert jedes Elements dar. * @returns {number} der Wert der Position mit dem Index n. * /
Funktion calFibValue(n) {
    console.count("Anzahl der Ausführungen:")
    gibt n < 2 zurück? 1: (calFibValue(n - 1) + calFibValue(n - 2));
}

/**
 * @description Berechnungsergebnisse drucken* @param {number} n stellt die Anzahl der zu druckenden Elemente dar*/
Funktion printRes(n) {
    für (let index = 0; index < n; index++) {
        Konsole.log(calFibValue(index));
    }
}

//Rufen Sie die Druckmethode auf printRes(10);

// Ausführungszeiten: 276

analysieren:

Der Einsatz von Rekursion verbessert zwar die Qualität des Codes, bringt aber auch ein anderes Problem mit sich: die Leistung.

Der Wert jedes Artikels wird berechnet und akkumuliert, beginnend mit dem ersten Artikel. Der Prozess zur Berechnung des Wertes des vierten Artikels ist beispielsweise wie folgt:

  • Gibt den Wert des ersten Elements zurück: 1.
  • Gibt den Wert des zweiten Elements zurück: 1 .
  • Der dritte Term berechnet sich zu 1 + 1 = 2.
  • Der vierte Term berechnet sich zu 2 + 1 = 3.

Bei der Berechnung des Werts des fünften Elements muss das obige Verfahren verwendet werden, um den Wert des vierten Elements zu ermitteln, was eine große Anzahl wiederholter Vorgänge erfordert.

Um beim Interviewer zu überzeugen, müssen wir aber dennoch weitere Optimierungen vornehmen!

Rekursive Optimierung

Lösung:

  • Die Logik des rekursiven Teils führt zu wiederholten Berechnungen, daher liegt hier der Optimierungspunkt.
  • Da es sich um wiederholte Operationen handelt, bedeutet dies, dass die nachfolgenden Operationen tatsächlich die zuvor berechneten Werte verwenden können. Daher müssen wir einen Cache einführen, um die Ergebnisse jeder Berechnung zu speichern.

Code-Implementierung:

/**
 * @description Berechnen Sie den Wert des n-ten Elements. * @param {number} n stellt den Indexwert jedes Elements dar. * @returns {number} der Wert der Position mit dem Index n. * /

// Eine Map-Struktur, die die Ergebnisse jeder Berechnung speichert // Hier kann auch ein Array verwendet werden, aber aus semantischer Sicht gibt es hier keine Map oder kein Objekt direkt let fibValueMap = new Map();
Funktion calFibValue(n) {
    console.count("Anzahl der Ausführungen: ");
    // Wenn der entsprechende Wert bereits im Cache vorhanden ist, direkt zurückgeben, if (fibValueMap.has(n)) {
        fibValueMap.get(n) zurückgeben;
    }
    konstanter Wert = n < 2 ? 1 : (calFibValue(n - 1) + calFibValue(n - 2));
    // Nachdem jedes Element berechnet wurde, muss es rechtzeitig in der Karte gespeichert werden
    fibValueMap.set(n, Wert);
    Rückgabewert;
}

/**
 * @description Berechnungsergebnisse drucken* @param {number} n stellt die Anzahl der zu druckenden Elemente dar*/
Funktion printRes(n) {
    für (let index = 0; index < n; index++) {
        Konsole.log(calFibValue(index));
    }
}

//Rufen Sie die Druckmethode auf printRes(10);

// Ausführungszeiten: 26

analysieren:

Laut der abgedruckten Zählung beträgt die Anzahl der Rekursionen nach der Optimierung etwa 1/10 der Anzahl vor der Optimierung, was ein überraschendes Ergebnis ist.

Ich denke, der Interviewer wird dieses Mal zufrieden sein.

Zusammenfassen

Egal wie sich die Dinge ändern, das Wesentliche bleibt dasselbe. Solange Sie eine klare Vorstellung davon haben, wie das Problem gelöst werden kann, ist die Codeimplementierung nur ein Ergebnis. Bei unserer täglichen Arbeit und beim Lernen müssen wir bewusst unser divergentes Denken kultivieren und Probleme aus verschiedenen Blickwinkeln betrachten. Möglicherweise entdecken Sie unterschiedliche Szenarien! Ich hoffe, es kann für alle eine Inspiration sein!

Es ist verständlich, dass wir in einem Vorstellungsgespräch einige scheinbar ausgefeilte Ideen verwenden, um unsere einzigartigen Qualitäten hervorzuheben oder wenn die Fragen im Vorstellungsgespräch spezifische Anforderungen stellen.

In der täglichen Arbeit empfehle ich jedoch dennoch: Wenn die Leistung ähnlich ist und das Problem mit grundlegenden Methoden gelöst werden kann, verwenden Sie keine „fortgeschrittenen“ Methoden, da die Fehlerwahrscheinlichkeit bei grundlegenden Methoden viel geringer ist. Beispielsweise bietet für das heutige Problem die Basislösung tatsächlich die beste Leistung.

Wenn wir weniger Fehlerberichte schreiben, haben wir mehr Zeit zum Faulenzen, oder?

Dies ist das Ende dieses Artikels über die JavaScript-Ausgabe der Fibonacci-Folge. Weitere relevante Inhalte zur JS-Ausgabe der Fibonacci-Folge finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • JavaScript verwendet document.write() zur Ausgabe von Zeilenumbrüchen
  • Ein Beispiel für die Implementierung von Code für die schrittweise Textausgabe basierend auf js
  • Zusammenfassung gängiger Methoden für Javascript zur wiederholten Ausgabe einer bestimmten Zeichenfolge
  • Mehrere Möglichkeiten zur Datenausgabe in JavaScript

<<:  Implementierung der Docker-Bereitstellung von Django+Mysql+Redis+Gunicorn+Nginx

>>:  Klassischer MySQL-High-Level-/Befehlszeilenvorgang (schnell) (empfohlen)

Artikel empfehlen

Beispiel für das Erstellen eines virtuellen Hosts basierend auf dem Apache-Port

Apache: Virtuellen Host basierend auf Port erstel...

Überwachen Sie die Größenänderung eines DOM-Elements über Iframe

Ein während des Entwicklungsprozesses häufig auft...

JavaScript implementiert den Div-Maus-Drag-Effekt

In diesem Artikel wird der spezifische Code für J...

Richtige Methode zum Laden von Schriftarten in Vue.js

Inhaltsverzeichnis Schriftarten mit font-face ric...

Diagramm des Tomcat CentOS-Installationsprozesses

Tomcat CentOS-Installation Dieses Installationstu...

Über das Problem der vertikalen Zentrierung von img und span in div

Wie unten dargestellt: XML/HTML-CodeInhalt in die...

Details zur zugrundeliegenden Datenstruktur von MySQL-Indizes

Inhaltsverzeichnis 1. Indextyp 1. B+ Baum 2. Was ...

MySQL 8.0 MIT Abfragedetails

Inhaltsverzeichnis Informationen zu WITH-Abfragen...

CUDA8.0 und CUDA9.0 koexistieren unter Ubuntu16.04

Vorwort Einige der früheren Codes auf Github erfo...

So zeigen Sie Bildinformationen in Docker an

In diesem Artikel müssen wir lernen, wie man Bild...