¿Tu idioma tiene una profundidad de recursión máxima (MRD)?
Digamos que su idioma tiene MRD = 500
Escriba un código que encuentre la profundidad de recursión y genere el valor exacto
Para el caso anterior, su programa (o función) debería generar 500
Code-Golf ¡La respuesta más corta gana!
Respuestas:
Mathematica, 15 bytes
¯ \ _ (ツ) _ / ¯
Pruébalo en línea!
fuente
Python 3 , 40 bytes
Pruébalo en línea!
Sin solo leerlo desde el builtin. Comenzamos en 2 en lugar de 1 porque la cláusula except se ejecuta un nivel antes de que ocurra un error. Este es un byte más corto en Python 2, por supuesto.
fuente
JavaScript (Babel) ,
353329 bytesPruébelo aquí , o use el fragmento a continuación para probarlo en
eval
lugar dedo
.Puerto Japt , 24 bytes
Realmente no vale la pena publicar esto como una solución separada, ya que es, esencialmente, idéntico.
Pruébalo
Explicación
JavaScript en sí mismo no tiene un límite de recursión per se, sino que el intérprete impone el límite (es decir, el navegador). ¡Qué bueno que definimos los idiomas por su intérprete aquí! Entre otros factores, el límite puede variar según el navegador y la memoria disponible, lo que se ve afectado por las operaciones que se realizan. El siguiente fragmento ilustra ese último punto, usando las 5 versiones diferentes de esta solución que pasé. Como puede ver en las últimas 2 pruebas, en Chrome, al menos, incluso el orden de las operaciones puede marcar la diferencia.
Dado eso, por lo tanto, no tenemos la conveniencia de una constante o método para trabajar. En cambio, vamos a crear una función que se llame a sí misma de forma continua antes, eventualmente, a la basura. En su forma más simple que es:
Pero eso no nos sirve para este desafío, ya que solo arroja un error de desbordamiento sin indicación de cuántas veces se
f
llamó a sí mismo. Podemos evitar el errortry
ing a la llamadaf
de forma continua ycatch
ing cuando falla:No hay error, pero aún no hay valor de retorno de cuántas veces la función logró llamarse a sí misma antes de fallar, porque en
catch
realidad no está haciendo nada. Intentemos evaluar latry / catch
declaración:Ahora tenemos un valor que se devuelve (y, dado que se trata de un código de golf, nos ahorramos unos pocos bytes al usar un real
return
). Sin embargo, el valor que se devuelve esundefined
nuevamente porquecatch
no está haciendo nada. Afortunadamente para nosotros-~undefined==1
y-~n==n+1
, por lo tanto, al abrir una-~
llamada en frente de la llamadaf
, esencialmente tenemos-~-~ ... -~-~undefined
, con otra-~
antepuesta con cada llamada, dándonos la cantidad de veces quef
se llamó.fuente
f=_=>eval('try{-~f()}catch(e){}')
Mathematica (no incorporado), 20 bytes
Omitir el
;
cálculo1+$IterationLimit
(probablemente porque Mathematica optimiza la función de cola). Alternativamente,0 //. x_ -> x + 1
calculeReplaceRepeated
el valor predeterminadoMaxIteration
, es decir,65536
(que es mayor que los dos valores anteriores).(Este es un fragmento de código que evalúa el resultado. Sin embargo, la otra solución de Mathematica también lo es)
fuente
J, 8 bytes
Pruébalo en línea!
Por lo tanto, en realidad no sé cómo ejecutar un verbo sin ninguna entrada y una breve búsqueda (así como una intuición personal) hace que parezca que eso no es posible. Si es así, avíseme cómo hacerlo y eliminaré o actualizaré mi respuesta. Sin embargo, no tiene sentido que un verbo no tenga entrada. A la luz de esto, la función dada espera
0
, la entrada predeterminada "vacía" para enteros. Probablemente pueda cambiarlo para usar la matriz vacía (0$0
) si crees que es más apropiado.Editar: el OP ha permitido que la función tome 0.
Explicación
Esto se llama a sí mismo de manera recursiva, agregando 1 a la entrada (se espera 0) hasta que llegue a un error de pila. Cuando se
]
produce un error, llama a la adversa ( identidad correcta) en la entrada, que es solo 0.Por cierto, el espacio es necesario .
fuente
(1+$: ::]) 0
Python 3 ,
4132 bytesPruébalo en línea!
¡Guardado 9 bytes gracias a @FryAmTheEggman!
34 bytes
35 bytes
Los últimos 2 son gracias a @totallyhuman
fuente
C (gcc, Linux x64),
180133 bytes-4 bytes gracias a @scottinet
Pruébalo en línea!
Instala un controlador SIGSEGV (señal 11) con una pila de señal alternativa (tamaño mínimo
MINSIGSTKSZ
es de 2 KB, el indicadorSA_ONSTACK
es 0x08000000), luego llama a una función sin argumentos y sin variables locales recursivamente hasta que la pila se desborda. Es interesante que la profundidad de recursión máxima varíe entre corridas, probablemente debido a ASLR.La profundidad máxima de recursión en C depende de muchos factores, por supuesto. En un sistema Linux típico de 64 bits, el tamaño predeterminado de la pila es de 8 MB, y la alineación de la pila es de 16 bytes, por lo que obtiene una profundidad de recursión de aproximadamente 512K para funciones simples.
También tenga en cuenta que el programa anterior no funciona
-O2
debido a la optimización de llamadas de cola.fuente
c
y llamandoexit
ysigaction
como parámetros. Esto no hace una diferencia notable en el resultado: enlace TIOJava 8,
13151484743 bytes-80 bytes gracias a @Nevay . También probé un método en lugar de un programa, pero cometí un error y terminé con un programa completo. Ahora es un método.
-3 bytes gracias a @Neil haciendo uso de en
finally
lugar decatch(Error e)
.-5 bytes gracias a @Nevay nuevamente.
Explicación:
Pruébalo aquí.
fuente
int c(){try{return-~c();}catch(Error e){return 1;}}
int c(){int n=1;try{n=-~c();}finally{return n;}}
ahorra 3 bytes pero me da una respuesta diferente?int c(){int n=1;try{n+=c();}finally{return n;}}
int d;int c(){try{c();}finally{return++d;}}
Octava, 19 bytes
Uso:
fuente
R ,
322618 bytes-8 bytes gracias a Sven Hohenstein :
$
hará una coincidencia parcial, por lo que podemos usar enexp
lugar de la completaexpressions
.El
options
comando también se puede utilizar para establecer la profundidad de recursión, es decir,options(expressions=500)
para 500.Pruébalo en línea!
fuente
ressions
debido a una coincidencia parcial con$
.Octava ,
252220 bytes2 bytes eliminados gracias a una sugerencia de Sanchises
Función anónima que genera el valor.
Pruébalo en línea!
fuente
()
, yamax_recursion_depth
que también es una función.@
para mantenerla distinta (definiendo una función en lugar de REPL'ing el resultado).disp
(lo habría incluido, pero esa es mi opinión personal sobre Octave REPL, y no estoy seguro de ningún meta consenso sobre eso)zsh, 24 bytes
Pruébalo en línea! (Ver debajo de depuración)
bash, 24 bytes
Pruébalo en línea! (Ver debajo de depuración)
ksh93, 27 bytes
Pruébalo en línea! (Ver debajo de depuración)
guión, 27 bytes
Pruébalo en línea! (Excede la salida de depuración de tio, ejecútela en su propio shell)
fuente
i=0
yecho
no estar incluido en su conteo de bytes?Lua , 52 bytes
Pruébalo en línea!
fuente
f
enpcall
.--
puede confirmar que sigue siendo una llamada recursiva sin optimizacionesq / kdb +, 16 bytes
Solución:
Ejemplo:
Explicación:
Intente repetir, aumente x en uno cada vez, si hay un error, devuelva x
fuente
Excel-VBA, 26 bytes
No es la profundidad de recursión per-se, esto realmente genera el número máximo de iteraciones para una celda en una hoja de cálculo de Excel. Dado que el resultado pertenece a un idioma diferente al idioma en el que está escrito, quizás esto sea más apropiado:
Excel + Excel-Vba, 3 + 38 = 41 bytes
Como eso se puede llamar desde una celda con
Para VBA sin incorporado:
Excel-VBA,
534440 bytes-9 como variable ya no necesita inicializarse o imprimirse
-4 ya que la ejecución del código ya no tiene que finalizar para evitar múltiples impresiones
Llame con s en la ventana inmediata, salidas a la celda A1 de la hoja de trabajo
(la advertencia tarda un tiempo en ejecutarse ahora, agregue
Application.ScreenUpdating = False
primero)fuente
Lua ,
4537 bytesPruébalo en línea!
No sé con qué valor inicializar
x
ya que no sé la cantidad de llamadas intermedias que hay ...fuente
Clojure,
725548 bytes-23 bytes al deshacerse del átomo
-7 bytes gracias a @madstap. Cambió a usar
fn
overdef
y#()
, ypr
overprintln
.Escribí y probé en mi teléfono. La aplicación Clojure REPL me dio una profundidad de 13087.
Solución básica Repetir hasta que se arroje un SO, incrementando un contador cada repetición. Cuando se lanza, se imprime el valor del contador.
fuente
pr
lugar deprintln
. También -2 bytes haciendo que el fn sea así: en((fn f[x](,,,))0)
lugar de(def f #(,,,))(f 0)
.VBA, cualquier tipo,
4139 bytesLlame usando
?A()
en la ventana Inmediato, o como función de hoja de trabajo.Nota: Devuelve 4613 en Excel-VBA, mientras que la respuesta de @Greedo devuelve 3666 en mi sistema (el más alto debería ser el máximo). Aparentemente también varía entre los programas de Office (Access-VBA devuelve 4622, Word-VBA 4615)
Editar: Guess VBA agrega automáticamente las paréntesis, por lo que las eliminó.
fuente
Pyth - 9 bytes
Si puedo ejecutarlo como la respuesta J anterior, esto es de 7 bytes porque puedes sacar el último
yZ
.Pruébelo en línea aquí .
fuente
764
, pero tienes razón la mayor parte del tiempo no da salida.Adelante, 48 bytes
Bucles hasta que llega al límite.
Pruébalo en línea
fuente
Tcl , 18 bytes
Pruébalo en línea!
recursionlimit
se puede abreviar ar
Tcl , 31 bytes
Pruébalo en línea!
fuente
Tcl , 49 bytes
Pruébalo en línea!
fuente
Ruby, 39 bytes
Suprimir el mensaje de error es un poco más corto que rescatarlo, ya que de forma predeterminada
rescue
no se capturaSystemStackError
.Hay una respuesta más cursi si puedo mostrar en unario, representando
n
con n caracteres consecutivos de nueva línea:Ruby, 35 bytes
fuente
Gelatina , 18 bytes
:( *
Pruébalo en línea!
¿Cómo?
* Desde Jelly hasta donde yo sé:
(1) establece el límite de recursión de Python antes de configurar gran parte de su propio intérprete y analizar el código que se ejecutará; y
(2) no tiene forma de detectar errores de Python.
No estoy seguro de si hay una manera de evaluar de manera confiable el límite de recursión o imprimirlo, ya que se descubre, además de preguntarle a Python cuál fue el valor establecido ( ¡Me encantaría ver si se puede hacer!), Así que eso es lo que hace el código aquí:
fuente