Dieser Artikel lernt funktionale Programmierung unter folgenden Aspekten:
1. Welche Beziehung besteht zwischen mathematischen Formeln und funktionaler Programmierung
Um ein einfaches Beispiel zu nennen: In der Mathematik gibt es ein Konzept namens Mapping (y=f(x)). Vereinfacht ausgedrückt ist es eine Funktion. Die bekannteste dürfte die quadratische Funktion sein (Parabel y=a*x*x+b*x+c)
Jetzt implementiert die Codierung den Wert eines bestimmten Punktes auf der Parabel. Wir wissen, dass a, b , c sind Parameter, x ist die unabhängige Variable und y ist die abhängige Variable. Wenn es vorher so wäre, könnte ich es so implementieren (um an das C++ zu erinnern, das ich schon lange nicht mehr geschrieben habe, werde ich es schreiben c++)
double getParabola(double a,double b,double c,double x) { return a*x*x+b*x+c; }
Frage 1. Finden Sie bei einer gegebenen Parabel den Wert, wenn x=2, x=3, x=4. Dies ist die folgende Methode
resultA = getParabola(a,b,c,2) resultB = getParabola(a,b,c,2) resultC = getParabola(a,b,c,2)
Dies ist eine normale Methode in der Programm. Gibt es jedoch aus mathematischer Sicht eine Möglichkeit, mit dem mathematischen Formeldenken in Einklang zu kommen? Das Folgende ist eine weitere Implementierung von mir (hier mit go implementiert, weil ich weiß, wie man in C++ schreibt):
func getParabola(aa,bb,cc float32){ var a = aa var b = bb var c = cc a := func(x float32) { return a*x*x+b*x+c } return a }
Dann lautet die Lösung auch für Frage 1 wie folgt
parabola := getParabola(a,b,c) resultA := parabola(2) resultB := parabola(3) resultC := parabola(4)
Ist es nicht dasselbe, als würde man den Wert einer Funktion ermitteln? Daher werden mathematische Beziehungen in der funktionalen Programmierung gut dargestellt.
2. Was sind die Merkmale der funktionalen Programmierung und welche Konzepte werden von Go unterstützt?
Die funktionale Programmierung weist drei Hauptmerkmale auf
1. Unveränderlichkeit von Variablen: Sobald einer Variablen ein Wert zugewiesen wurde, kann dieser nicht mehr geändert werden. Wenn Änderungen erforderlich sind, müssen diese kopiert und dann geändert werden. Sobald einer String-Variablen in Go ein Wert zugewiesen wurde, kann sie nicht wie in C++ wie c[2]='a' geändert werden. Stattdessen muss sie explizit in []Byte konvertiert und dann geändert werden. Aber es ist bereits ein weiteres Stück Erinnerung.
2. Funktionale erstklassige Bürger: Funktionen sind ebenfalls Variablen und können im Programm als Parameter, Rückgabewerte usw. übergeben werden. Diese Funktion sollte sowohl von C++ als auch von Go unterstützt werden.
3. Schwanzrekursion: Das Konzept der Rekursion wurde in der Fibonacci-Folge gelernt. Wenn die Rekursion sehr tief ist, kann der Stapel explodieren und zu erheblichen Leistungseinbußen führen. Was die Endrekursionsoptimierungstechnologie betrifft, kann der Stapel bei jeder Rekursion wiederverwendet werden, wenn der Compiler sie unterstützt (Endrekursion bedeutet, dass der rekursive Aufruf im letzten Schritt erfolgt. Zu diesem Zeitpunkt werden die vorherigen Ergebnisse als Parameter an den letzten Schritt übergeben des Aufrufs, daher hat der vorherige Zustand keine Auswirkung mehr, sodass der Stapel wiederverwendet werden kann.
Gemeinsame Techniken in der funktionalen Programmierung
1. Map&Reduce&Filter
Map wird verwendet, um für jede Eingabe dieselbe Funktion aufzurufen, um eine Ausgabe zu erzeugen, z for_each in C++, Map in Hadoop, Map in Python usw.
Reduzieren wird verwendet, um jede Eingabe zur vorherigen Ausgabe hinzuzufügen, um die nächste Ausgabe zu erhalten, z. B. Reduzieren in Python und Hadoop.
Filter wird zum Filtern verwendet, z. B. count_if von C++ usw. .
2. Rekursion
3. Pipeline
Fügen Sie die Funktionsinstanz in ein Array oder eine Liste ein und übergeben Sie die Daten dann an die Aktionsliste, und die Eingabe wird sequentiell übergeben zu jedem Die Funktion wird ausgeführt (was bedeutet, dass die Ausgabe jeder Funktion als Eingabe einer anderen Funktion verwendet wird, die Daten fließen und die Berechnung festgelegt ist, ähnlich dem Konzept des Sturms), und schließlich erhalten wir das gewünschte Ergebnis.
4. Andere (noch zu untersuchen)
3. Funktionale Programmierung und Betriebseffizienz
Das wichtigste Konzept der funktionalen Programmierung sind Funktionsgleichungen sind Bürger erster Klasse, Funktionen und Variablen sind gleich. Kann als Parameter, Rückgabewert usw. verwendet werden. Die Verwendung von Zuweisungsanweisungen wird nicht bevorzugt, daher wird die Rekursion häufiger verwendet, sodass die Effizienz der funktionalen Programmierung definitiv geringer ist.
Was ich in letzter Zeit verwende, ist das Konzept des Abschlusses. Jedes Mal, wenn der Abschlussausdruck ausgewertet wird, unterscheidet sich das Ergebnis von einem Eine gewöhnliche Funktion ist ein ausführbarer Code. Solange der Eingang bestimmt ist, wird auch die aufrufende Position bestimmt. Im obigen Parabelbeispiel führt der Aufruf von
a:=getParabola(0.2,0.1,0.3) b:=getParabola(0.1,0.1,0.4)
beispielsweise zu zwei Parabeln. Der Grund, warum ich denke, dass die Effizienz verringert wird, liegt darin, dass der Abschluss selbst ein Prozess der Bewertung und Zuweisung ist, der die Erstellung und Zerstörung von Variablen beinhaltet. Natürlich habe ich die Leistung nicht wirklich getestet. Wenn die Effizienz nachfolgender Release-Server abnimmt, ist dies möglicherweise eine Überlegung wert.
Weitere Go-Sprachkenntnisse finden Sie in der Spalte Go-Sprach-Tutorial auf der chinesischen PHP-Website.
Das obige ist der detaillierte Inhalt vonApropos funktionale Programmierung aus der Sprachschließung von Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!