An diesem Wochenende habe ich mich entschlossen, meine Hand bei Scala und Clojure auszuprobieren, ich bin mit objektorientierter Programmierung kompetent, und so war Scala einfach als Sprache abholen, wollte aber funktionale Programmierung ausprobieren. Hier ist es hart. Ich kann es nur T scheinen, um meinen Kopf in eine Art des Schreibens von Funktionen Als ein Experte funktionale Programmierer, wie kommen Sie ein Problem. Gezigt eine Liste von Werten und eine definierte Periode der Summation, wie würden Sie generieren eine neue Liste der einfachen gleitenden Durchschnitt von Die Liste. Für Beispiel Bei den Listenwerten 2 0, 4 0, 7 0, 6 0, 3 0, 8 0, 12 0, 9 0, 4 0, 1 0 und der Periode 4 sollte die Funktion 0 0 zurückgeben , 0 0, 0 0, 4 75, 5 0, 6 0, 7 25, 8 0, 8 25, 6 5. Nach dem Verbringen eines Tages, der es übermacht, das Beste, was ich in Scala kommen könnte, war das. Ich weiß Das ist schrecklich ineffizient, ich mache lieber etwas wie. Jetzt würde das in einem imperativen Stil leicht gemacht werden, aber ich kann t für das Leben von mir ausarbeiten, wie man das funktionell aussagt. Interesting Problem kann ich an viele Lösungen denken, Mit unterschiedlichem Wirkungsgrad, um das Zeug wiederholt hinzuzufügen, ist nicht wirklich ein Leistungsproblem, aber lassen Sie es annehmen, dass es auch ist, die Nullen am Anfang können später vorbereitet werden, also lasst uns nicht darum kümmern, sie zu produzieren Wenn der Algorithmus ihnen natürlich zur Verfügung stellt, Gut, wenn nicht, korrigieren wir es später. Starting mit Scala 2 8, die folgenden würde das Ergebnis für n Periode geben, indem man gleitend, um ein Schiebefenster der Liste zu bekommen. Trotzdem, obwohl dies ziemlich elegant ist, hat es nicht das Beste Leistung möglich, weil es nicht von Vorteil bereits berechneten Ergänzungen Also, von ihnen zu sprechen, wie können wir sie bekommen. Lassen wir sagen, wir schreiben dies. Wir haben eine Liste der Summe von jedem zwei Paare Lassen Sie uns versuchen, dieses Ergebnis zu verwenden Um den gleitenden Durchschnitt von 4 Elementen zu berechnen Die obige Formel hat die folgende Berechnung gemacht. So, wenn wir jedes Element nehmen und es dem zweiten nächsten Element hinzufügen, erhalten wir den gleitenden Durchschnitt für 4 Elemente. Wir können es so machen. Wir könnten dann Berechnen Sie den gleitenden Durchschnitt für 8 Elemente, und so weiter Nun, es gibt einen bekannten Algorithmus, um Dinge zu berechnen, die einem solchen Muster folgen. Es ist am meisten bekannt für seine Verwendung bei der Berechnung der Macht einer Zahl Es geht wie folgt. So, lassen Sie sich bewerben Es hier. So, hier s die Logik Periode 0 ist ungültig, Periode 1 ist gleich der Eingabe, Periode 2 ist Schiebefenster von Größe 2 Wenn größer als das, kann es sogar oder ungerade. Wenn seltsam, fügen wir jedes Element zu Das MovingSum der nächsten ungeraden - 1 Elemente Zum Beispiel, wenn 3, fügen wir jedes Element dem MovingSum der nächsten 2 Elemente hinzu. Wenn wir sogar das MovingSum für n 2 berechnen, dann addiere jedes Element zu den folgenden n 2 Schritten. Mit dieser Definition können wir dann wieder auf das Problem zurückgreifen und dies tun. Es gibt eine leichte Ineffizienz in Bezug auf die Verwendung von aber es s o Periode, nicht Es kann effizienter mit einem Schwanz rekursive Funktion gemacht werden Und natürlich die Definition von Schieben, die ich zur Verfügung gestellt habe, ist schrecklich leistungsstark, aber es wird eine viel bessere Definition von es auf Scala 2 8 Beachten Sie, dass wir t machen eine effiziente Schiebe-Methode auf einer Liste, aber wir können es auf einem Iterable. Having sagte alle Dass ich mit der allerersten Definition gehe und nur dann optimiere, wenn eine kritische Pfadanalyse dies als eine große Sache erkannt hat. Um zu schließen, lasst man überlegen, wie ich über das Problem ging Wir haben ein gleitendes durchschnittliches Problem Ein gleitender Durchschnitt ist die Summe Von einem bewegenden Fenster auf einer Liste, geteilt durch die Größe dieses Fensters Also, zuerst, ich versuche, ein Schiebefenster zu bekommen, Summe alles darauf und dann durch die Größe zu teilen. Das nächste Problem war, Wiederholung von bereits berechneten Ergänzungen zu vermeiden In diesem Fall ging ich zur kleinsten Ergänzung, und ich versuchte herauszufinden, wie man größere Summen berechnen kann, um solche Ergebnisse wiederzuverwenden. Schließlich lasst man versuchen, das Problem so zu lösen, wie du es gedacht hast, indem du das vorherige Ergebnis addierst und subtrahierst Der erste Durchschnitt ist einfach. Jetzt machen wir zwei Listen Zuerst wird die Liste der Elemente subtrahiert Als nächstes wird die Liste der Elemente hinzugefügt werden. Wir können diese beiden Listen mit Zip hinzufügen Diese Methode wird nur produzieren so viele Elemente wie die kleineren Liste hat, die das Problem der Subtraktion größer als nötig vermeidet. Wir beenden durch Komponieren des Ergebnisses mit einer fold. which ist die Antwort zurückzugeben Die ganze Funktion sieht so aus. Ich kenne Clojure besser als Scala, also hier geht wie ich Schreibe dies die andere Clojure Eintrag hier ist zwingend, dass s nicht wirklich, was Sie nach und isn t idiomatic Clojure Der erste Algorithmus, der mir in den Sinn kommt, nimmt wiederholt die angeforderte Anzahl von Elementen aus der Sequenz, fällt das erste Element und wiederkehrende. Die folgenden Arbeiten auf jede Art von Sequenz Vektor oder Liste, faul oder nicht und gibt eine faulen Reihenfolge von Durchschnittswerten --- was könnte hilfreich sein, wenn Sie arbeiten auf einer Liste von unbestimmten Größe Beachten Sie, dass es kümmert sich um die Basis Fall implizit Rückkehr nil wenn es aren t genug Elemente in der Liste zu konsumieren. Running dies auf Ihre Testdaten ergibt. It doesn t geben 0 für die ersten paar Elemente in der Sequenz, obwohl das könnte leicht etwas künstlich behandelt werden. Die einfachste Sache von allen Ist zu sehen, das Muster und in der Lage sein, in Erinnerung zu bringen, eine verfügbare Funktion, die passt die Rechnung Partition gibt eine faulen Blick auf Teile einer Sequenz, die wir dann abbilden können. Jemand fragte nach einem Schwanz rekursive Version Schwanz Rekursion vs Faulheit ist ein Ein bisschen ein Kompromiss Wenn dein Job eine Liste aufbaut, dann macht deine Funktion Schwanz rekursiv ist in der Regel ziemlich einfach, und das ist keine Ausnahme --- nur aufbauen die Liste als Argument für eine Unterfunktion Wir sammeln zu einem Vektor statt Eine Liste, denn sonst wird die Liste rückwärts aufgebaut werden und muss am Ende umgekehrt werden. Hop ist ein Weg, um eine anonyme innere Funktion Art wie Scheme s namens let recur muss in Clojure verwendet werden, um Schwanz Anrufe konjizieren zu beseitigen Eine verallgemeinerte Verabredung in der Art und Weise natürlich für die Sammlung --- der Beginn der Listen und das Ende der Vektoren. answered Aug 24 09 bei 2 58. Ich habe beschlossen, zu diesem alten Q hinzuzufügen, weil das Thema kam wieder und ich Finde es vorzuziehen, auf diese schöne Sammlung von möglichen Lösungen zu verweisen, während ich meine eigene Aufnahme hinzufüge, die sich von früheren Versionen in Clojure unterscheidet, wie es in der A erklärt wird. Vielleicht können wir das umfangreichste Repository der funktionalen mov-avg-Implementierungen - Micha Marczyk - aufbauen Mar 2 10 bei 0 20.Hier sa teilweise punktfrei eine Zeile Haskell Lösung. Erste es gilt Schwänze auf die Liste, um die Schwänze Listen, so. Reverses es und fällt die ersten p Einträge nehmen p als 2 hier. Falls Sie Aren t vertraut mit dem Punktnippel-Symbol, es ist der Operator für funktionale Komposition, dh es übergibt die Ausgabe einer Funktion als Eingang eines anderen, komponiert sie zu einer einzigen Funktion gf bedeutet, f auf einen Wert zu setzen und dann den Ausgang an g weiterzugeben , So fgx ist das gleiche wie gfx Im Allgemeinen führt seine Verwendung zu einer klareren Programmierung style. It dann ordnet die Funktion ausIntegral p sum nehmen p auf die Liste Also für jede Liste in der Liste nimmt es die ersten p Elemente, summiert sie, dann teilt Sie von p Dann klopfen wir einfach die Liste wieder mit Reverse. This alle sieht viel mehr ineffizient als es umgekehrt doesn t körperlich umgekehrt die Reihenfolge einer Liste, bis die Liste ausgewertet wird, es legt es einfach auf den Stapel gut ol Lazy Haskell Schwänze auch nicht alle diese separaten Listen, es nur verweist auf verschiedene Abschnitte der ursprünglichen Liste Es ist immer noch keine gute Lösung, aber es eine Zeile long. Here eine etwas schönere, aber längere Lösung, die mapAccum verwendet, um eine gleitende Subtraktion zu tun Und zusätzlich. First wir teilen die Liste in zwei Teile bei p, so. Sum das erste Bit. Zip das zweite Bit mit der ursprünglichen Liste dies nur paar Artikel aus der Reihenfolge aus den beiden Listen Die ursprüngliche Liste ist offensichtlich länger, aber wir verlieren Dieses extra bit. Jetzt definieren wir eine Funktion für unsere mapAccum ulator mapAccumL ist die gleiche wie Karte, aber mit einem extra laufenden Zustand Akkumulator Parameter, die von der vorherigen Zuordnung an die nächste übergeben wird, wie Karte läuft durch die Liste Wir verwenden den Akkumulator Als unser gleitender Durchschnitt, und da unsere Liste aus dem Element besteht, das gerade das Schiebefenster verlassen hat und das Element, das gerade in die Liste eingegangen ist, die wir gerade gezippt haben, nimmt unsere Schiebefunktion die erste Zahl x weg vom Durchschnitt und fügt den zweiten hinzu Zahl y Wir passieren dann die neuen s entlang und kehren s geteilt durch p snd Sekunden nimmt nur das zweite Mitglied eines Paares Tupel, das verwendet wird, um den zweiten Rückgabewert von mapAccumL zu nehmen, als mapAccumL wird den Akkumulator sowie die zugeordneten zurückgeben List. For diejenigen von Ihnen nicht vertraut mit dem Symbol ist es der Anwendungs-Operator Es doesn t wirklich alles tun, aber es hat eine hat eine niedrige, rechts-assoziative verbindliche Vorrang, so bedeutet es, dass Sie die Klammern nehmen können, nehmen Sie LISPers, iefx ist Das gleiche wie f x. Running ma 4 2 0, 4 0, 7 0, 6 0, 3 0, 8 0, 12 0, 9 0, 4 0, 1 0 ergibt 4 75, 5 0, 6 0, 7 25 , 8 0, 8 25, 6 5 für beide Lösung. Oh und du musst die Modulliste importieren, um eine Lösung zu kompilieren. Daniel Danke Schreibcode ist viel einfacher als es zu erklären - Sie haben das Wesentliche beschrieben Zwei Lists Streams werden in beiden Funktionen beibehalten und bekommen ihre Köpfe bei jeder Iteration abgenommen One List Stream dient als die Hauptsammlung, um durchzuleiten, während die anderen List Stream, die die gleiche Sammlung ist, außer hat die Periode weniger Doubles genommen, wird bei der Berechnung des neuen gleitenden Durchschnittes Walter Chang am 24. August um 17 19 verwendet. Die J Programmiersprache erleichtert Programme wie gleitender Durchschnitt In der Tat gibt es Weniger Zeichen in als in ihrem Etikett, gleitender Durchschnitt. Für die Werte in dieser Frage einschließlich der Namen Werte hier ist ein einfacher Weg, um dies Code. Wir können dies beschreiben, indem Sie Etiketten für Komponenten. Bei Beispiele verwenden genau das gleiche Programm Die einzige Unterschied ist die Verwendung von mehr Namen in der zweiten Form Solche Namen können Leser helfen, die don t kennen die J Primaries. Let s Blick ein bisschen weiter in das, was los ist in der Unterprogramm, durchschnittlich bedeutet Summation und bezeichnet Division wie das klassische Zeichen Berechnung Eine Tally-Zählung von Items wird durch das Gesamtprogramm durchgeführt, dann ist die Summe von Werten geteilt durch die Tally von Werten. Das Ergebnis der gleitenden Durchschnitt Berechnung hier nicht enthalten die führenden Nullen in der ursprünglichen Frage erwartet Diese Nullen sind Wohl nicht Teil der beabsichtigten Berechnung. Die hier verwendete Technik wird als stillschweigende Programmierung bezeichnet. Es ist so ziemlich das gleiche wie die punktfreie Art der funktionalen Programmierung. answered Aug 26 10 at 16 15.Hier ist Clojure vorgibt, eine funktionellere Sprache zu sein Dies ist völlig schwanzrekursiv, btw, und enthält führende Nullen. Usually habe ich die Sammlung oder Liste Parameter zuletzt, um die Funktion leichter zu Curry Aber in Clojure. is so umständlich, ich in der Regel am Ende tun dies in diesem Fall, es Doesn t wirklich egal welche bestellen die Parameter go. answered Aug 24 09 bei 4 56.Hi Jonathan, ich bin ziemlich neu in dieser funktionalen Programmierung, könnten Sie mir bitte erklären, wie dies ist tail-rekursive Danke James P Aug 24 09 bei 14 38. Die Rekursion geschieht auf der if-Anweisung, wobei jede Option auf recur basiert. Dies wird jeden Parameter zuerst berechnen und erst dann wiederkehren. Die Antwort wird das Ergebnis von recur sein. Als Ergebnis ergibt sich das gleiche Ergebnis, das von der Rekursion zurückgegeben wird Andere Berechnungen, das ist Schwanz rekursiv Daniel C Sobral Aug 24 09 at 15 20.Dieses Beispiel nutzt den Zustand, da für mich ist es eine pragmatische Lösung in diesem Fall und eine Schließung, um die Fenster-Mittelung Funktion zu schaffen. Es ist immer noch funktional in Der Sinn für die Verwendung von erstklassigen Funktionen, obwohl es nicht Nebenwirkung frei ist Die beiden Sprachen, die Sie erwähnten, laufen beide auf der JVM und damit beide erlauben staatlichen Management, wenn nötig. answered Aug 24 09 bei 1 55. Dies ist möglich Lösung ist in Haskell, die mir mehr vertraut ist. Erweiterte Aug 24 09 bei 10 23. Ich mag die Verwendung der Match-Anweisung Ich habe versucht, etwas Ähnliches zu machen, aber konnte nicht ganz den ganzen Weg dort James P Aug 24 09 an 14 39. Eine kurze Clojure-Version, die den Vorteil hat, O-Listenlänge unabhängig von deiner Periode zu sein. Dies macht die Tatsache aus, dass du die Summe eines Zahlenbereichs berechnen kannst, indem du eine kumulative Summe der Sequenz zB 1 2 3 4 5 schaffst - 0 1 3 6 10 15 und dann subtrahieren Sie die beiden Zahlen mit einem Offset gleich Ihrer Periode. Being spät auf der Party, und neue zu funktionalen Programmierung auch, kam ich zu dieser Lösung mit einer inneren Funktion. Ich habe die Idee, zu Teilen die ganze Liste durch den Zeitraum len im Voraus Dann generiere ich die Summe, um mit den Len-First-Elementen zu beginnen und ich generiere die ersten, ungültigen Elemente 0 0, 0 0. Dann rekultiviere ich rekursiv die erste und füge den letzten Wert hinzu Am Ende liste ich das Ganze auf, das am 29. April 10 um 19 Uhr im Haskell Pseudocode. Jetzt sollte man wirklich die 4 out. answered Jul 23 13 bei 13 45. Die Taste ist die Schwänze Funktion, die eine Liste auf eine Liste der Kopien der ursprünglichen Liste, mit der Eigenschaft, dass die n-ten Element des Ergebnisses Fehlt die ersten n-1 Elemente. Wir wenden fmap avg nehmen n auf das Ergebnis, was bedeutet, dass wir die n-Länge Präfix aus der Unterliste nehmen und berechnen ihre avg Wenn die Länge der Liste, die wir sind, ist nicht n, Dann berechnen wir nicht den Durchschnitt, da es undefiniert ist. In diesem Fall kehren wir nichts zurück, wenn es ist, wir tun und wickeln es in Gerade endlich laufen wir catMaybes auf das Ergebnis von fmap avg nehmen n, um loszuwerden, die vielleicht Type. answered Oct 21 13 at 1 29. Ich war überrascht und enttäuscht von der Aufführung dessen, was mir die idiomatischsten Clojure-Lösungen erschien, JamesCunningham s lazy-seq solutions. So hier eine Kombination von James-Lösung mit der Idee, Exponentiation to moving sums. Edit this one - basiert auf mikera s Lösung - ist noch schneller. answered Jul 22 13 bei 19 21.Your Antwort.2017 Stack Exchange, Inc. Erzeugt in Spark 1 4, Spark Fenster Funktionen verbessert die Ausdruckskraft von Spark DataFrames und Spark SQL Mit Fensterfunktionen können Sie problemlos eine gleitende durchschnittliche oder kumulative Summe berechnen oder einen Wert in einer vorherigen Zeile einer Tabelle verweisen. Fensterfunktionen ermöglichen es Ihnen, viele gemeinsame Berechnungen mit DataFrames durchzuführen, ohne auf RDD-Manipulation zurückgreifen zu müssen. Aggregate, UDFs vs Fensterfunktionen. Window-Funktionen ergänzen die vorhandenen DataFrame-Operationsaggregate wie Summe und avg und UDFs Um zu überprüfen, berechnen Aggregate für jede Gruppe von Zeilen ein Ergebnis, eine Summe oder einen Durchschnitt, während UDFs jeweils ein Ergebnis berechnen Zeile auf der Grundlage von nur Daten in dieser Zeile Im Gegensatz dazu berechnen Fensterfunktionen ein Ergebnis für jede Zeile basierend auf einem Fenster von Zeilen Zum Beispiel in einem gleitenden Durchschnitt, berechnen Sie für jede Zeile den Durchschnitt der Zeilen um die aktuelle Zeile, die dies sein kann Getan mit Fenster-Funktionen. Moving Durchschnittliches Beispiel. Lassen Sie uns tauchen direkt in die gleitenden durchschnittlichen Beispiel In diesem Beispiel Datensatz gibt es zwei Kunden, die unterschiedliche Mengen an Geld jeden Tag ausgegeben haben. Aufbau des Kunden DataFrame Alle Beispiele sind in Scala mit Spark 1 6 1 geschrieben, aber das gleiche kann in Python oder SQL. val Kunden getan werden 2016-05-01, 50 00. Alice, 2016-05-03, 45 00. Alice Bob, 2016-05-01, 25 00.Window-Funktion und Window Spec-Definition. Wie im obigen Beispiel gezeigt, gibt es zwei Teile zum Anwenden einer Fensterfunktion 1, die die Fensterfunktion angibt, Wie zB avg im Beispiel und 2, die die fensterspezifikation oder wSpec1 im Beispiel für 1 angeben, finden Sie eine vollständige Liste der Fensterfunktionen hier. Sie können Funktionen verwenden, die unter Aggregatfunktionen und Fensterfunktionen aufgeführt sind. Für 2, die ein Fenster angeben Spec, es gibt drei Komponenten partition by, order by und frame. Partition durch definiert, wie die Daten im obigen Beispiel gruppiert ist, war es von Kunden Sie müssen eine vernünftige Gruppierung angeben, da alle Daten innerhalb einer Gruppe gesammelt werden Gleiche Maschine Idealerweise wurde der DataFrame bereits durch die gewünschte Gruppierung partitioniert. Order durch definiert, wie Zeilen innerhalb einer Gruppe im obigen Beispiel geordnet sind, war es von date. Frame definiert die Grenzen des Fensters in Bezug auf die aktuelle Zeile in der Oben Beispiel, das Fenster reichte zwischen der vorherigen Zeile und dem nächsten row. Cumulative Sum. Next, lassen Sie uns berechnen die kumulative Summe der Menge pro Kunde ausgegeben. Fenster spezifiziert der Rahmen reicht von Anfang an zur aktuellen Zeile 0.val wSpec2 0. Erstellen Sie eine neue Spalte, die die Summe über den definierten Fensterrahmen berechnet. Durchschnittliche gleitende Durchschnitt. Durchschnittlich gleitender Durchschnitt Sie werden aufgefordert, diese Aufgabe zu lösen Die Aufgabe Beschreibung, mit jeder Sprache, die Sie möglicherweise wissen, die einfache gleitende Durchschnitt einer Reihe von Zahlen. Create eine Stateful-Funktion Klasse Instanz, die eine Periode nimmt und gibt eine Routine, die eine Zahl als Argument und gibt einen einfachen gleitenden Durchschnitt seiner Argumente so Weit. Ein einfacher gleitender Durchschnitt ist eine Methode, um einen Durchschnitt eines Stroms von Zahlen zu berechnen, indem nur die letzten P-Zahlen aus dem Strom gemittelt werden, wobei P als Periode bekannt ist. Es kann durch Aufruf einer Initialisierungsroutine mit P als dessen implementiert werden Argument, IP, die dann eine Routine zurückgeben sollte, die, wenn sie mit einzelnen, aufeinanderfolgenden Mitgliedern eines Stroms von Zahlen aufgerufen wird, den Mittelwert von bis zu dem letzten P von ihnen berechnet, lasst uns diese SMA nennen. Das Wort, das in der Aufgabenbeschreibung aufgeführt ist, bezieht sich auf Auf die Notwendigkeit für SMA, sich an bestimmte Informationen zwischen Anrufen zu erinnern. Der Zeitraum, P. An bestellt Container von mindestens die letzten P-Nummern aus jedem seiner einzelnen Anrufe. Stateful bedeutet auch, dass aufeinander folgende Anrufe an I, der Initialisierer, zurückkehren sollte Separate Routinen, die nicht gespeicherten Status teilen, so dass sie auf zwei unabhängigen Datenströmen verwendet werden könnten. Pseudocode für eine Implementierung von SMA ist. Diese Version verwendet eine persistente Warteschlange, um die aktuellsten p-Werte zu halten Jede Funktion, die von init-moving zurückgegeben wird - Automat hat seinen Zustand in einem Atom, das einen Warteschlangenwert hält. Diese Implementierung verwendet eine kreisförmige Liste, um die Zahlen innerhalb des Fensters am Anfang jedes Iterationszeigers zu speichern, bezieht sich auf die Listenzelle, die den Wert hält, der gerade aus dem Fenster herauskommt und zu Durch den gerade addierten Wert ersetzt werden. Mit einem Closure edit. Currently dieser sma kann t nogc sein, weil es eine Schließung auf dem Heap erlaubt Einige Escape-Analyse könnte die Heap-Allokation entfernen. Using eine Struct-Edit. This Version vermeidet die Heap-Zuweisung von Die Schließung hält die Daten im Stack-Frame der Hauptfunktion Gleiche Ausgabe. Um zu vermeiden, dass die Gleitkomma-Approximationen sich häufen und wachsen, könnte der Code eine periodische Summe auf dem gesamten kreisförmigen Warteschlangen-Array ausführen. Diese Implementierung erzeugt zwei Funktionsobjekte, die den Status teilen Es ist idiomatisch in E, um die Eingabe von der Ausgabe zu lesen, die aus dem Schreiben gelesen wird, anstatt sie in ein Objekt zu kombinieren. Die Struktur ist die gleiche wie die Implementierung der Standardabweichung E. Das Elixir-Programm unten erzeugt eine anonyme Funktion mit einer eingebetteten Periode p, die ist Verwendet als die Periode des einfachen gleitenden Durchschnitts Die Run-Funktion liest numerische Eingabe und übergibt sie an die neu erstellte anonyme Funktion und überprüft dann das Ergebnis auf STDOUT. Die Ausgabe wird unten gezeigt, mit dem Durchschnitt, gefolgt von der gruppierten Eingabe, bilden Die Basis für jeden gleitenden Durchschnitt. Erlang hat Schließungen, aber unveränderliche Variablen Eine Lösung ist dann die Verwendung von Prozessen und eine einfache Nachricht übergeben basierte API. Matrix Sprachen haben Routinen, um die Gleitende Gehälter für eine bestimmte Sequenz von Items zu berechnen. Es ist weniger effizient zu Schleife wie in den folgenden Befehlen. Kontinuierlich fordert eine Eingabe I, die am Ende einer Liste hinzugefügt wird L1 L1 kann durch Drücken von 2ND 1 gefunden werden, und Mittelwert finden Sie in Liste OPS. Press ON, um das Programm zu beenden. Funktion, die Gibt eine Liste zurück, die die gemittelten Daten des mitgelieferten Arguments enthält. Programm, das bei jedem invocation. list einen einfachen Wert zurückgibt, ist die Liste, die gemittelt wird p ist die Periode 5 gibt die gemittelte Liste zurück. Example 2 Mit dem Programm movinav2 i, 5 - Initialisierung des Verschiebens Durchschnittliche Berechnung und definieren die Periode von 5 movinav2 3, xx - neue Daten im Listenwert 3 und das Ergebnis wird auf Variable x gespeichert und angezeigt movinav2 4, xx - neuer Datenwert 4 und das neue Ergebnis wird gespeichert Variable x, und angezeigt 4 3 2.Description der Funktion movinavg Variable r - ist das Ergebnis der gemittelten Liste, die zurückgegeben wird Variable i - ist die Indexvariable und zeigt auf das Ende der Unterliste die Liste gemittelt wird Variable z - eine Helpervariable. Die Funktion nutzt die Variable i, um zu bestimmen, welche Werte der Liste in der nächsten Durchschnittsberechnung berücksichtigt werden. Bei jeder Iteration zeigt die Variable i auf den letzten Wert in der Liste, der in der Durchschnittsberechnung verwendet wird Wir müssen nur herausfinden, welches der erste Wert in der Liste sein wird. In der Regel müssen wir p Elemente berücksichtigen, also wird das erste Element dasjenige sein, das von ip 1 indiziert wird. Allerdings wird bei den ersten Iterationen die Berechnung normalerweise negativ sein Nach der Gleichung werden negative Indizes max ip 1,1 oder die Anordnung der Gleichung, max ip, 0 1 aber die Anzahl der Elemente auf den ersten Iterationen wird auch kleiner sein, wird der richtige Wert Endindex - Start Index 1 oder Arrangieren Die Gleichung, i - max ip, 0 1 1 und dann, i-max ip, 0 Variable z hält den gemeinsamen Wert max ip, 0 so ist der Anfangsindex z 1 und die Nummernbezüge sind iz. mid Liste, z 1 , Iz wird die Liste der Wert, die gemittelte Summe wird Summe sie Summe iz ri wird sie durchschnittlich und speichern Sie das Ergebnis an der entsprechenden Stelle in der Ergebnisliste. fp1 erstellt eine partielle Anwendung, die in diesem Fall die zweiten und dritten Parameter .
No comments:
Post a Comment