f=_=>do{try{-~f()}catch(e){}}
- 2 Bytes gespart dank Neil.
Versuchen Sie es hier , oder verwenden Sie das Snippet unten zu testen es mit evalstatt do.
console.log((f=_=>eval(`try{-~f()}catch(e){}`))())
Japt Port, 24 Byte
Es lohnt sich nicht, dies als separate Lösung zu veröffentlichen, da es im Wesentlichen identisch ist.
Ox`try\{-~rp()}¯t®(e)\{}
Probier es aus
Erläuterung
JavaScript selbst hat kein Rekursionslimit an sich, sondern das Limit wird vom Interpreter (dh dem Browser) auferlegt - gut, dass wir hier die Sprachen durch den Interpreter definieren! Unter anderem kann das Limit je nach Browser und verfügbarem Speicher variieren, was sich auf die ausgeführten Vorgänge auswirkt. Das folgende Snippet veranschaulicht diesen letzten Punkt anhand der 5 verschiedenen Versionen dieser Lösung, die ich durchlaufen habe. Wie Sie den letzten beiden Tests entnehmen können, kann zumindest in Chrome die Reihenfolge der Vorgänge einen Unterschied ausmachen.
console.log((f=(i=0)=>eval(`try{f(i+1)}catch(e){i}`))())
console.log((f=i=>eval(`try{f(-~i)}catch(e){i}`))())
console.log((f=(i=0)=>eval(`try{f(++i)}catch(e){i}`))())
console.log((f=_=>eval(`try{-~f()}catch(e){}`))())
console.log((f=_=>eval(`try{f()+1}catch(e){0}`))())
console.log((f=_=>eval(`try{1+f()}catch(e){0}`))())
Aus diesem Grund verfügen wir nicht über die Bequemlichkeit einer Konstante oder Methode, mit der wir arbeiten können. Stattdessen werden wir eine Funktion erstellen, die sich ständig selbst aufruft, bevor sie schließlich ausfällt. In seiner einfachsten Form ist das:
f=_=>f()
Aber das nützt uns nicht viel für diese Herausforderung, da es nur einen Überlauffehler auslöst, ohne dass angegeben wird, wie oft es sich fselbst angerufen hat. Wir können den Fehler vermeiden , indem trying zu Anruf fkontinuierlich und catching , wenn es fehlschlägt:
f=_=>{try{f()}catch(e){}}
Kein Fehler, aber immer noch kein Rückgabewert dafür, wie oft die Funktion es geschafft hat, sich selbst aufzurufen, bevor ein Fehler auftrat, da sie catcheigentlich nichts unternimmt. Lassen Sie uns versuchen, die try / catchAnweisung zu bewerten :
f=_=>eval(`try{f()}catch(e){}`)
Jetzt wird ein Wert zurückgegeben (und da dies Codegolf ist, haben wir uns mit einem tatsächlichen Wert ein paar Bytes gespart return). Der zurückgegebene Wert ist jedoch wieder, undefinedweil der catchkeine Aktion ausführt. Zum Glück für uns -~undefined==1und -~n==n+1so durch ein Aufspringen -~vor dem Aufruf fhaben wir im Wesentlichen bekommen -~-~ ... -~-~undefined, mit einem anderen -~bei jedem Aufruf vorangestellt, so dass die Anzahl der Zeiten fgenannt wurden.
f=_=>eval(`try{-~f()}catch(e){}`)