Apakah bahasa Anda memiliki kedalaman rekursi maksimum (MRD)?
Katakanlah bahasa Anda memiliki MRD = 500
Tulis kode yang menemukan kedalaman rekursi dan menampilkan nilai yang tepat
Untuk kasus di atas, program Anda (atau fungsi) harus menghasilkan 500
Kode-Golf Jawaban terpendek menang!
Jawaban:
Mathematica, 15 byte
¯ \ _ (ツ) _ / ¯
Cobalah online!
sumber
Python 3 , 40 byte
Cobalah online!
Tanpa hanya membacanya dari builtin. Kita mulai dari 2 bukannya 1 karena klausa kecuali dijalankan satu tingkat sebelum kesalahan. Ini adalah byte yang lebih pendek di python 2, tentu saja.
sumber
JavaScript (Babel) ,
353329 byteMencobanya di sini , atau gunakan Cuplikan di bawah ini untuk mengujinya dengan
eval
bukando
.Port Japt , 24 byte
Tidak benar-benar layak memposting ini sebagai solusi terpisah karena pada dasarnya identik.
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.
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:
Tapi itu tidak banyak berguna bagi kami untuk tantangan ini karena hanya melemparkan kesalahan meluap tanpa indikasi berapa kali
f
menyebut dirinya. Kita bisa menghindari kesalahan dengantry
ing panggilanf
terus menerus dancatch
ing ketika gagal:Tidak ada kesalahan, tetapi masih tidak ada nilai balik berapa kali fungsi berhasil memanggil dirinya sendiri sebelum gagal, karena
catch
sebenarnya tidak melakukan apa-apa. Mari kita coba mengevaluasitry / catch
pernyataan:Sekarang kita punya nilai yang dikembalikan (dan, karena ini adalah kode golf, menyelamatkan diri beberapa byte dari penggunaan yang sebenarnya
return
). Nilai yang dikembalikan adalahundefined
, sekali lagi karenacatch
tidak melakukan apa-apa. Untungnya bagi kita-~undefined==1
dan-~n==n+1
, dengan muncul-~
di depan panggilan untukf
, pada dasarnya kita punya-~-~ ... -~-~undefined
, dengan yang lain-~
diawali dengan setiap panggilan, memberi kita berapa kalif
dipanggil.sumber
f=_=>eval('try{-~f()}catch(e){}')
Mathematica (tidak ada built-in), 20 byte
Menghilangkan
;
akan menghitung1+$IterationLimit
(mungkin karena Mathematica tail-mengoptimalkan fungsi). Alternatifnya,0 //. x_ -> x + 1
menghitungReplaceRepeated
defaultMaxIteration
, yaitu65536
(yang lebih besar dari kedua nilai di atas).(Ini adalah potongan kode yang mengevaluasi hasilnya. Namun solusi Mathematica lainnya juga)
sumber
J, 8 byte
Cobalah online!
Jadi, saya tidak benar-benar tahu bagaimana mengeksekusi kata kerja tanpa input dan beberapa pencarian singkat (serta intuisi pribadi) membuatnya tampak seperti itu tidak mungkin. Jika ya, beri tahu saya cara melakukannya dan saya akan menghapus atau memperbarui jawaban saya. Namun tidak masuk akal jika kata kerja tidak diberi input. Sehubungan dengan ini, fungsi yang diberikan mengharapkan
0
, input "kosong" default untuk bilangan bulat. Saya mungkin bisa mengubahnya untuk menggunakan array kosong (0$0
) jika Anda pikir itu lebih cocok.Sunting: OP telah memungkinkan fungsi untuk mengambil 0.
Penjelasan
Ini panggilan itu sendiri secara rekursif, menambahkan 1 ke input (0 diharapkan) hingga hits kesalahan tumpukan. Ketika kesalahan, itu memanggil yang merugikan (
]
identitas-kanan) pada input, yang hanya 0.Ngomong-ngomong, ruang itu perlu .
sumber
(1+$: ::]) 0
Python 3 ,
4132 byteCobalah online!
Disimpan 9 byte berkat @FryAmTheEggman!
34 byte
35 byte
2 yang terakhir adalah terima kasih kepada @totallyhuman
sumber
C (gcc, Linux x64),
180133 byte-4 byte terima kasih kepada @scottinet
Cobalah online!
Menginstal handler SIGSEGV (sinyal 11) dengan tumpukan sinyal alternatif (ukuran minimum
MINSIGSTKSZ
adalah 2 KB, flagSA_ONSTACK
0x08000000), kemudian memanggil fungsi tanpa argumen dan tidak ada variabel lokal secara rekursif sampai stack meluap. Sangat menarik bahwa kedalaman rekursi maksimum bervariasi di seluruh lintasan, mungkin karena ASLR.Kedalaman rekursi maksimum dalam C tergantung pada banyak faktor, tentu saja. Pada sistem Linux 64-bit yang tipikal, ukuran stack default adalah 8 MB, dan alignment stack adalah 16 byte, sehingga Anda mendapatkan kedalaman rekursi sekitar 512K untuk fungsi-fungsi sederhana.
Perhatikan juga bahwa program di atas tidak berfungsi
-O2
karena pengoptimalan panggilan ekor.sumber
c
dan memanggilexit
dansigaction
sebagai parameter. Ini tidak membuat perbedaan nyata pada hasilnya: TIO linkJava 8,
13151484743 byte-80 byte terima kasih kepada @Nevay . Saya mencoba metode bukan program juga, tetapi membuat kesalahan sehingga berakhir dengan program penuh .. Sekarang metode.
-3 byte terima kasih kepada @Neil dengan memanfaatkan
finally
bukannyacatch(Error e)
.-5 byte terima kasih kepada @Nevay lagi.
Penjelasan:
Coba di sini.
sumber
int c(){try{return-~c();}catch(Error e){return 1;}}
int c(){int n=1;try{n=-~c();}finally{return n;}}
menghemat 3 byte tetapi memberi saya jawaban yang berbeda?int c(){int n=1;try{n+=c();}finally{return n;}}
int d;int c(){try{c();}finally{return++d;}}
Oktaf, 19 byte
Pemakaian:
sumber
R,
322618 bytes-8 bytes thanks to Sven Hohenstein :
$
will do partial matching, so we can just useexp
instead of the fullexpressions
.The
options
command can also be used to set the recursion depth, i.e.,options(expressions=500)
for 500.Try it online!
sumber
ressions
due to partial matching with$
.Octave,
252220 bytes2 bytes removed thanks to a suggestion by Sanchises
Anonymous function that outputs the value.
Try it online!
sumber
()
, asmax_recursion_depth
is also a function.@
to keep it distinct (defining a function rather than REPL'ing the result).disp
(I would have included it, but that's my personal opinion on Octave REPL, and I am not sure of any meta consensus on that)zsh, 24 bytes
Try it online! (See under debug)
bash, 24 bytes
Try it online! (See under debug)
ksh93, 27 bytes
Try it online! (See under debug)
dash, 27 bytes
Try it online! (Exceeds tio debug output, run it in your own shell)
sumber
i=0
and theecho
not be included in your byte count?Lua, 52 bytes
Try it online!
sumber
f
inpcall
.--
you can confirm that it is still a recursive call with no optimizationsq/kdb+, 16 bytes
Solution:
Example:
Explanation:
Try to recurse, increase x by one each time, if error, return x.
sumber
Excel-VBA, 26 Bytes
Not recursion depth per-se, this actually outputs the maximum number of iterations for a cell in an Excel worksheet. Given that the output pertains to a language other than the language in which this is written, perhaps this is more appropriate:
Excel + Excel-Vba, 3 + 38 = 41 Bytes
As that can be called from a cell with
For VBA with no built in:
Excel-VBA,
534440 bytes-9 as variable no longer needs to be initialised or printed
-4 as code execution no longer has to be ended to avoid multiple prints
Call with s in the immediate window, outputs to cell A1 of the worksheet
(warning takes a while to run now, add
Application.ScreenUpdating = False
first)sumber
Lua,
4537 bytesTry it online!
I don't know which value to initialize
x
with as I don't know the number of intermediary calls there are...sumber
Clojure,
725548 bytes-23 bytes by getting rid of the atom
-7 bytes thanks to @madstap. Switched to using
fn
overdef
and#()
, andpr
overprintln
.Wrote and tested on my phone. The Clojure REPL app gave me a depth of 13087.
Basic solution. Recurse until a SO is thrown, incrementing a counter each recurse. When it's thrown, the value of the counter is printed.
sumber
pr
instead ofprintln
. Also -2 bytes by making the fn like this:((fn f[x](,,,))0)
instead of(def f #(,,,))(f 0)
.VBA, any type,
4139 bytesCall using
?A()
in the Immediate window, or as worksheet function.Note: Returns 4613 in Excel-VBA, while the answer by @Greedo returns 3666 on my system (highest should be the max). Apparently also varies between Office programs (Access-VBA returns 4622, Word-VBA 4615)
Edit: Guess VBA auto-adds parantheses, so removed them.
sumber
Pyth - 9 bytes
If I can run it like the J answer above, this is 7 bytes because you can take out the last
yZ
.Try it online here.
sumber
764
, but you're right most of the time it gives no output.Forth, 48 bytes
Loops until it hits the limit.
Try it online
sumber
Tcl, 18 bytes
Try it online!
recursionlimit
can be abbreviated tor
Tcl, 31 bytes
Try it online!
sumber
Tcl, 49 bytes
Try it online!
sumber
Ruby, 39 bytes
Suppressing the error message is a little shorter than rescuing it, since by default
rescue
doesn't catchSystemStackError
.There's a cheesier answer if I can output in unary, representing
n
with n consecutive newline characters:Ruby, 35 bytes
sumber
Jelly, 18 bytes
:( *
Try it online!
How?
* Since Jelly as far as I am aware:
(1) sets the Python recursion limit prior to setting up much of its own interpreter and parsing the code to be run; and
(2) has no way of catching Python errors
I'm not sure if there is a way to either reliably evaluate the recursion limit or to print it out as it is discovered other than to actually ask Python what the value was set to (I'd love to see if it can be done though!) so that's what the code here does:
sumber