f=_=>do{try{-~f()}catch(e){}}
- 2 байта сохранены благодаря Нейлу.
Попробуйте здесь , или используйте фрагмент ниже, чтобы проверить его с evalвместо do.
console.log((f=_=>eval(`try{-~f()}catch(e){}`))())
Порт Japt , 24 байта
Не стоит публиковать это как отдельное решение, поскольку оно, по сути, идентично.
Ox`try\{-~rp()}¯t®(e)\{}
Проверь это
объяснение
Сам по себе JavaScript не имеет предела рекурсии как такового, скорее, ограничение накладывается интерпретатором (то есть браузером) - хорошо, что мы определяем языки их интерпретатором здесь! Среди прочих факторов, предел может варьироваться в зависимости от браузера и доступной памяти, на который влияют выполняемые операции. Следующий фрагмент иллюстрирует этот последний момент, используя 5 различных версий этого решения, которые я прошел. Как видно из последних 2 тестов, в 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вызывая ее, когда она не работает:
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){}`)