f=_=>do{try{-~f()}catch(e){}}
- 2 байти збережено завдяки Нілу.
Спробуйте тут , або скористайтеся фрагментом нижче, щоб перевірити його evalзамість do.
console.log((f=_=>eval(`try{-~f()}catch(e){}`))())
Порт- джапт , 24 байти
Насправді не варто розміщувати це як окреме рішення, оскільки воно, по суті, ідентичне.
Ox`try\{-~rp()}¯t®(e)\{}
Перевірте це
Пояснення
Сам JavaScript сам по собі не має межі рекурсії, скоріше обмеження накладається перекладачем (тобто браузером) - добре, що ми визначаємо мови, використовуючи їх перекладач. Серед інших факторів, ліміт може змінюватись залежно від браузера та наявної пам'яті, на що впливають виконувані операції. Наступний фрагмент ілюструє цю останню точку, використовуючи 5 різних версій цього рішення, які я пройшов. Як видно з двох останніх тестів, у Chrome, принаймні, навіть порядок операцій може змінити значення.
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}`))())
Враховуючи це, ми не маємо зручності константи або методу роботи. Натомість ми будемо створювати функцію, яка постійно дзвонить перед тим, зрештою, вискакуючи. У найпростішій формі це:
f=_=>f()
Але це не дуже корисно нам для цього виклику, оскільки воно лише видаляє помилку переповнення, не вказуючи на те, скільки разів fназиває себе. Ми можемо уникнути помилок при tryІНГАХ дзвонити fбезперервно іcatch ING , коли він зазнає невдачі:
f=_=>{try{f()}catch(e){}}
Ніякої помилки, але все-таки немає значення повернення, скільки разів функція встигла зателефонувати собі, перш ніж вийти з ладу, оскільки catchнасправді нічого не робить. Спробуємо оцінитиtry / catch твердження:
f=_=>eval(`try{f()}catch(e){}`)
Тепер ми отримали значення, яке повертається (і, оскільки це код гольфу, ми заощадили кілька байтів за допомогою фактичного return). Значення, яке повертається, undefinedзнову ж таки, тому що catchне робить нічого. На щастя для нас, -~undefined==1і -~n==n+1так, вискочивши -~перед дзвінком f, ми, по суті, отримали -~-~ ... -~-~undefinedще один -~заздалегідь приздалегідь кожен виклик, який дав нам кількість разів f.
f=_=>eval(`try{-~f()}catch(e){}`)