Wie Schreibe ich einen Pfeil Funktion im ES6 rekursiv?
Pfeil-Funktionen in ES6 nicht über eine arguments
Eigenschaft und daher arguments.callee
wird nicht funktionieren und wäre sowieso nicht im strict-Modus auch wenn gerade eine anonyme Funktion verwendet wurde.
Pfeil-Funktionen können nicht benannt werden, so dass der name funktionellen expression trick nicht verwendet werden können.
Also... Wie schreibt man eine rekursive Pfeil-Funktion? Das ist ein Pfeil-Funktion, die rekursiv ruft sich selbst auf der Grundlage bestimmter Bedingungen und so weiter natürlich?
- Sie können üblichen Funktionen, wahrscheinlich arrow-Funktionen ist nicht eine richtige Werkzeug für Rekursion nennt.
- Eine faktorielle Funktion ist eine Anweisung, wenn der ternäre operator verwendet. Eine einzelne Anweisung anonyme Funktion ist sicherlich ein Fall für einen Pfeil-Funktion.
- Warum nicht die Zuordnung der Funktion zu einer Variablen, die wiederum im Rahmen der Funktion Körper?
- Das wäre nicht sehr robust. Wenn die Funktion zugeordnet ist, um eine andere variable und dem original zugewiesen wird, um einen neuen Wert zu, dein code bricht. Dieses Problem kann gelöst werden unter Verwendung einer benannten funktionellen Ausdruck in der Regel, aber die Pfeil-Funktionen können nicht benannt werden, die nicht in Ihrem eigenen Bereich zumindest.
- Wenn Sie verwenden Sie const, dann kann das original nicht neu belegt werden. Scheint durchaus robust, und in der Tat, ist nun weit verbreitet.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schreiben Sie eine rekursive Funktion ohne es zu benennen ein problem, das so alt wie die informatik selbst (auch ältere, tatsächlich, da λ-Kalkül ist ein Vorläufer der informatik), da im λ-Kalkül alle Funktionen sind anonym, und noch Sie noch brauchen Rekursion.
Die Lösung ist die Verwendung eines fixpoint combinator, in der Regel die Y-combinator. Diese sieht ungefähr so aus:
Dieser berechnet die Fakultät von
5
rekursiv.Hinweis: der code ist stark basiert auf dieser: Die Y Combinator erklärt mit JavaScript. Alle Kredit geht an den ursprünglichen Autor. Habe ich meist nur "harmonisierten" (ist es das, was Sie rufen refactoring alten code mit neuen Funktionen von ES/Harmonie?) es.
let Y = (le => ((f => f(f))(f => le((x) => f(f)(x)))));
die verwendet werden könnten, für die Fakultät alslet factorial = Y( fact => (n => n < 2 ? 1 : n * fact(n - 1)) );
Claus Reinke gegeben hat, eine Antwort auf Ihre Frage in eine Diskussion über die esdiscuss.org website.
In ES6 Sie haben zu definieren, was er fordert eine Rekursion combinator.
Wenn Sie möchten, rufen Sie eine rekursive Pfeil-Funktion, müssen Sie zum Aufruf der Rekursion combinator mit den Pfeil-Funktion als parameter, der erste parameter der Pfeil-Funktion ist eine rekursive Funktion, und der rest sind die Parameter. Der name des rekursiven Funktion hat keine Bedeutung, als wäre es nicht verwendet werden, außerhalb der rekursiven combinator. Sie können dann aufrufen, die anonyme Pfeil-Funktion. Hier berechnen wir die Fakultät von 6.
Wenn Sie wollen, um es zu testen in Firefox müssen Sie mit den ES5 übersetzung der Rekursion combinator:
let rec = (f)=> (...args)=> f( (...args)=>rec(f)(...args), ...args ); rec( (f,n) => (n>1 ? n*f(n-1) : n) )(6);
Sieht es aus wie Sie zuweisen können, die Pfeil-Funktionen einer Variablen zu, und verwenden Sie es, um rufen Sie die Funktion rekursiv.
complex(2,3)
gibtInternalError: too much recursion
Verwenden Sie eine variable, die Sie zuweisen die Funktion, z.B.
Wenn Sie es wirklich brauchen anonyme, verwenden Sie die Y combinator, wie diese:
(ist das nicht häßlich?)
Einen Allgemeinen Zweck combinator für rekursive Funktionsdefinitionen von einer beliebigen Anzahl von Argumenten (ohne Verwendung der Variablen in sich selbst) wäre:
Dies könnte zum Beispiel benutzt werden, um zu definieren, Fakultät:
oder string-reverse:
oder in-order-tree-traversal:
Seit
arguments.callee
ist eine schlechte option, aufgrund der Missbilligung/funktioniert nicht im strict-Modus, und etwas zu tun, wievar func = () => {}
auch schlecht ist, ist dies ein hack wie beschrieben, in dieser Antwort ist wahrscheinlich Ihre einzige option:javascript: rekursive anonyme Funktion?
func = () => {}
gibt es wohl nicht in irgendeiner Weise, wenn Sie mit dem hack, wie in den anderen auch SO beantworten, dass ich auf die verlinkt wird.Wäre das eine option?
function
als gut und verkürzt nicht den benötigten code zu. Natürlich kann man gehen in Kreisen, wo eine gerade Linie möglich ist, aber ob es Sinn macht ist eine andere Frage.Zuzuordnen, können Sie Ihre Funktion um eine variable in einem iife
Dies ist eine version dieser Antwort, https://stackoverflow.com/a/3903334/689223, mit Pfeil-Funktionen.
Können Sie die
U
oder dieY
combinator. Y combinator wird das einfachste zu verwenden.U
combinator, mit dieser haben Sie zu halten, vorbei an der Funktion:const U = f => f(f)
U(selfFn => arg => selfFn(selfFn)('to infinity and beyond'))
Y
combinator, mit diesem können Sie nicht haben, um halten Sie übergeben der Funktion:const Y = gen => U(f => gen((...args) => f(f)(...args)))
Y(selfFn => arg => selfFn('to infinity and beyond'))
Ich fand die Lösungen sehr kompliziert, und ehrlich gesagt konnte nicht verstehen, alle von Ihnen, so dachte ich, sich eine einfachere Lösung ist mir (ich bin sicher, es ist schon bekannt, aber hier geht meiner Denkweise):
So, du machst eine faktorielle Funktion
den (???) ist, wo die Funktion soll sich selbst aufrufen, aber da kann man es nicht benennen, ist die offensichtliche Lösung ist, um übergeben Sie Sie als argument an sich
Dies wird nicht funktionieren wenn. denn wenn wir rufen
f(x-1)
wir nennen diese Funktion selbst, und wir gerade definiert es die Argumente wie 1)f
: die Funktion selbst wieder und 2)x
den Wert. Auch wir haben die Funktion selbstf
erinnern? so einfach geben Sie zunächst:... Und das ist es. Wir haben eine Funktion, sich selbst als das erste argument, die Herstellung der Factorial-Funktion! Nur wörtlich weitergeben zu sich selbst:
Anstelle des Schreibens es zweimal, können Sie eine weitere Funktion, die vergeht, es ist argument, um zu sich selbst:
und pass deine factorial-Funktion machen es:
Boom. Hier eine kleine Formel:
Für eine basic-Funktion fügt hinzu, dass die zahlen von 0 bis
x
,endCondition
ist, wenn Sie benötigen, um immer wiederkehrende, alsox => x == 0
.default
ist der Letzte Wert, den Sie geben einmalendCondition
erfüllt ist, sox => x
.operation
ist einfach der Vorgang, den Sie tun auf jeden Rekursion, wie die Multiplikation in der Fakultät oder hinzufügen, die in Fibonacci:x1 => x2 => x1 + x2
. und schließlichnextStep
ist der nächste Wert der Funktion übergibt, die in der Regel den aktuellen Wert minus eins:x => x - 1
. Anwendung:U
combinatorconst U = f => f(f)
ich denke, die einfachste Lösung ist ein Blick auf die einzige Sache, die Sie nicht haben, das ist ein Verweis auf die Funktion selbst. denn wenn Sie das haben, dann recusion ist trivial.
erstaunlich, dass das möglich ist durch eine Funktion höherer Ordnung.
diese Funktion, wie der name sugests, es generiert die Referenz, die wir benötigen. nun müssen wir nur wenden Sie diese, um unsere Funktion
aber das problem mit dieser Sache ist, dass unsere definition einer Funktion braucht, zu erwarten, eine sehr spezielle erste argument
möchte ich nennen diesen speziellen Wert, der als 'mir'. und jetzt jedesmal wenn wir brauchen Rekursion machen wir so
mit allem. wir können jetzt eine einfache faktorielle Funktion.
ich mag auch Blick auf die ein liner dieser