f=_=>do{try{-~f()}catch(e){}}
- 2 bajty zapisane dzięki Neilowi.
Wypróbuj tutaj lub użyj Snippet poniżej, aby go przetestować evalzamiast do.
console.log((f=_=>eval(`try{-~f()}catch(e){}`))())
Port Japt , 24 bajty
Naprawdę nie warto umieszczać tego jako osobnego rozwiązania, ponieważ jest to w zasadzie identyczne.
Ox`try\{-~rp()}¯t®(e)\{}
Sprawdź to
Wyjaśnienie
Sam JavaScript nie ma limitu rekurencji jako takiego, raczej jest narzucony przez tłumacza (tj. Przeglądarkę) - dobrze, że definiujemy języki przez ich tłumacza tutaj! Między innymi limit może się różnić w zależności od przeglądarki i dostępnej pamięci, na co mają wpływ wykonywane operacje. Poniższy fragment kodu ilustruje ten ostatni punkt, używając 5 różnych wersji tego rozwiązania, przez które przeszedłem. Jak widać z ostatnich 2 testów, w Chrome przynajmniej kolejność operacji może mieć znaczenie.
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}`))())
Biorąc to pod uwagę, dlatego nie mamy dogodności stałej lub metody do pracy. Zamiast tego stworzymy funkcję, która wywołuje się ciągle, zanim w końcu się wyłączy. W najprostszej formie to:
f=_=>f()
Ale to nie przydaje się nam w tym wyzwaniu, ponieważ generuje tylko błąd przepełnienia bez wskazania, ile razy się fnazywa. Możemy uniknąć błędu przez trying, aby dzwonić fciągle i catching, gdy się nie powiedzie:
f=_=>{try{f()}catch(e){}}
Bez błędu, ale wciąż brak wartości zwracanej ile razy funkcja zdołała się wywołać przed niepowodzeniem, ponieważ catchtak naprawdę nic nie robi. Spróbujmy ocenić try / catchstwierdzenie:
f=_=>eval(`try{f()}catch(e){}`)
Teraz zwracamy wartość (a ponieważ jest to golf golfowy, zaoszczędziliśmy kilka bajtów na faktycznym użyciu return). Zwracana jest jednak wartość undefined, ponieważ catchnic nie robi. Na szczęście dla nas -~undefined==1i -~n==n+1dlatego, wysyłając -~przed wezwaniem do f, w zasadzie dostaliśmy -~-~ ... -~-~undefined, z innym -~poprzedzającym każde połączenie, podając liczbę wywołań f.
f=_=>eval(`try{-~f()}catch(e){}`)