f=_=>do{try{-~f()}catch(e){}}
- 2 byte disimpan berkat Neil.
Mencobanya di sini , atau gunakan Cuplikan di bawah ini untuk mengujinya dengan evalbukan do.
console.log((f=_=>eval(`try{-~f()}catch(e){}`))())
Port Japt , 24 byte
Tidak benar-benar layak memposting ini sebagai solusi terpisah karena pada dasarnya identik.
Ox`try\{-~rp()}¯t®(e)\{}
Menguji
Penjelasan
JavaScript itu sendiri tidak memiliki batas rekursi per se, melainkan batas yang dikenakan oleh penerjemah (yaitu, browser) - hal yang baik kita mendefinisikan bahasa berdasarkan babak penerjemah mereka di sini! Di antara faktor-faktor lain, batas dapat bervariasi berdasarkan browser dan memori yang tersedia, yang dipengaruhi oleh operasi yang dilakukan. Cuplikan berikut menggambarkan poin terakhir, menggunakan 5 versi berbeda dari solusi ini yang saya lalui. Seperti yang dapat Anda lihat dari 2 tes terakhir, di Chrome, setidaknya, bahkan urutan operasi dapat membuat perbedaan.
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}`))())
Oleh karena itu, kami tidak memiliki kenyamanan konstanta atau metode untuk bekerja dengannya. Sebagai gantinya, kita akan membuat fungsi yang memanggil dirinya sendiri secara terus-menerus sebelum, akhirnya, keluar. Dalam bentuknya yang paling sederhana yaitu:
f=_=>f()
Tapi itu tidak banyak berguna bagi kami untuk tantangan ini karena hanya melemparkan kesalahan meluap tanpa indikasi berapa kali fmenyebut dirinya. Kita bisa menghindari kesalahan dengan trying panggilan fterus menerus dan catching ketika gagal:
f=_=>{try{f()}catch(e){}}
Tidak ada kesalahan, tetapi masih tidak ada nilai balik berapa kali fungsi berhasil memanggil dirinya sendiri sebelum gagal, karena catchsebenarnya tidak melakukan apa-apa. Mari kita coba mengevaluasi try / catchpernyataan:
f=_=>eval(`try{f()}catch(e){}`)
Sekarang kita punya nilai yang dikembalikan (dan, karena ini adalah kode golf, menyelamatkan diri beberapa byte dari penggunaan yang sebenarnya return). Nilai yang dikembalikan adalah undefined, sekali lagi karena catchtidak melakukan apa-apa. Untungnya bagi kita -~undefined==1dan -~n==n+1, dengan muncul -~di depan panggilan untuk f, pada dasarnya kita punya -~-~ ... -~-~undefined, dengan yang lain -~diawali dengan setiap panggilan, memberi kita berapa kali fdipanggil.
f=_=>eval(`try{-~f()}catch(e){}`)