Seu idioma possui uma profundidade de recursão máxima (MRD)?
Digamos que seu idioma tenha MRD = 500
Escreva um código que encontre a profundidade da recursão e produz o valor exato
Para o caso acima, seu programa (ou função) deve gerar 500
Code-Golf A resposta mais curta vence!
Respostas:
Mathematica, 15 bytes
¯ \ _ (ツ) _ / ¯
Experimente online!
fonte
Python 3 , 40 bytes
Experimente online!
Sem apenas ler a partir do builtin. Começamos com 2 em vez de 1 porque a cláusula de exceção é executada um nível antes de ocorrer um erro. Este é um byte mais curto no python 2, é claro.
fonte
JavaScript (Babel) ,
353329 bytesExperimente aqui ou use o Snippet abaixo para testá-lo em
eval
vez dedo
.JaptPorta , 24 bytes
Não vale a pena postar isso como uma solução separada, pois é essencialmente idêntico.
Teste-o
Explicação
O próprio JavaScript não possui um limite de recursão propriamente dito, mas o limite é imposto pelo intérprete (ou seja, pelo navegador) - é bom definirmos idiomas pelo intérprete deles 'por aqui! Entre outros fatores, o limite pode variar de acordo com o navegador e a memória disponível, impactada pelas operações que estão sendo executadas. O Snippet a seguir ilustra esse último ponto, usando as 5 versões diferentes desta solução pelas quais passei. Como você pode ver nos dois últimos testes, no Chrome, pelo menos, até a ordem das operações pode fazer a diferença.
Sendo assim, não temos a conveniência de uma constante ou método para trabalhar. Em vez disso, vamos criar uma função que se autodenomina continuamente antes, eventualmente, de exagerar. Na sua forma mais simples, é:
Mas isso não nos serve muito para esse desafio, pois gera apenas um erro de estouro, sem indicação de quantas vezes se
f
chamou. Podemos evitar o errotry
ing ao chamadof
continuamente ecatch
ing quando ele falhar:Sem erro, mas ainda sem valor de retorno de quantas vezes a função conseguiu se chamar antes de falhar, porque na
catch
verdade não está fazendo nada. Vamos tentar avaliar atry / catch
declaração:Agora temos um valor a ser devolvido (e, porque este é o golfe código, salvo se estabeleceu alguns bytes sobre o uso de um real
return
). O valor retornado, no entanto, éundefined
novamente porquecatch
não está fazendo nada. Felizmente para nós,-~undefined==1
e-~n==n+1
assim, pressionando um-~
na frente da chamadaf
, basicamente recebemos-~-~ ... -~-~undefined
uma outra-~
anexada a cada chamada, fornecendo o número de vezes que elaf
foi chamada.fonte
f=_=>eval('try{-~f()}catch(e){}')
Mathematica (sem embutido), 20 bytes
Omitir o
;
cálculo1+$IterationLimit
(provavelmente porque o Mathematica otimiza a função da cauda). Como alternativa,0 //. x_ -> x + 1
calculeReplaceRepeated
o padrãoMaxIteration
, ou seja,65536
(que é maior que os dois valores acima).(Este é um trecho de código que avalia o resultado. No entanto, a outra solução Mathematica também é)
fonte
J, 8 bytes
Experimente online!
Portanto, eu realmente não sei como executar um verbo sem nenhuma entrada e algumas pesquisas breves (além de intuição pessoal) fazem parecer que isso não é possível. Se for o caso, informe-me como fazê-lo e excluirei ou atualizarei minha resposta. Realmente não faz sentido que um verbo não dê entrada. Em vista disso, a função fornecida espera
0
, a entrada "vazia" padrão para números inteiros. Provavelmente posso alterá-lo para usar a matriz vazia (0$0
) se você achar que isso é mais adequado.Editar: o OP permitiu que a função assumisse 0.
Explicação
Isso se chama recursivamente, adicionando 1 à entrada (0 esperado) até encontrar um erro de pilha. Quando erra, chama o adverso (
]
-right identity) na entrada, que é apenas 0.A propósito, o espaço é necessário .
fonte
(1+$: ::]) 0
Python 3 ,
4132 bytesExperimente online!
Guardado 9 bytes graças a @FryAmTheEggman!
34 bytes
35 bytes
Os últimos 2 são graças a @totallyhuman
fonte
C (gcc, Linux x64),
180133 bytes-4 bytes graças a @scottinet
Experimente online!
Instala um manipulador SIGSEGV (sinal 11) com uma pilha de sinal alternativa (o tamanho mínimo
MINSIGSTKSZ
é 2 KB, sinalizadorSA_ONSTACK
é 0x08000000) e chama uma função sem argumentos e nenhuma variável local recursivamente até a pilha estourar. É interessante que a profundidade máxima da recursão varie entre as execuções, provavelmente devido ao ASLR.A profundidade máxima de recursão em C depende de muitos fatores, é claro. Em um sistema Linux típico de 64 bits, o tamanho padrão da pilha é 8 MB e o alinhamento da pilha é 16 bytes; portanto, você obtém uma profundidade de recursão de cerca de 512K para funções simples.
Observe também que o programa acima não funciona
-O2
devido à otimização da chamada de cauda.fonte
c
e chamandoexit
esigaction
como parâmetros. Isso não faz nenhuma diferença perceptível no resultado: link TIOJava 8,
13151484743 bytes-80 bytes graças a @Nevay . Eu tentei um método em vez de programa também, mas cometi um erro e acabei com um programa completo .. Agora é um método.
-3 bytes graças a @Neil , usando em
finally
vez decatch(Error e)
.-5 bytes graças a @Nevay novamente.
Explicação:
Experimente aqui.
fonte
int c(){try{return-~c();}catch(Error e){return 1;}}
int c(){int n=1;try{n=-~c();}finally{return n;}}
saves 3 bytes but gives me a different answer?int c(){int n=1;try{n+=c();}finally{return n;}}
int d;int c(){try{c();}finally{return++d;}}
Octave, 19 bytes
Usage:
fonte
R ,
322618 bytes-8 bytes, graças a Sven Hohenstein :
$
fará a correspondência parcial, para que possamos usar emexp
vez da totalidadeexpressions
.O
options
comando também pode ser usado para definir a profundidade da recursão, ou seja,options(expressions=500)
para 500.Experimente online!
fonte
ressions
devido à correspondência parcial com$
.Oitava ,
252220 bytes2 bytes removidos graças a uma sugestão de Sanchises
Função anônima que gera o valor.
Experimente online!
fonte
()
, comomax_recursion_depth
também é uma função.@
para mantê-la distinta (definindo uma função em vez de REPL'ing o resultado).disp
(I teria incluído, mas essa é a minha opinião pessoal sobre Octave REPL, e eu não estou certo de qualquer consenso meta nisso)zsh, 24 bytes
Experimente online! (Veja em debug)
bash, 24 bytes
Experimente online!(Veja em debug)
ksh93, 27 bytes
Experimente online!(Veja em debug)
traço, 27 bytes
Experimente online! (Excede a saída de depuração, execute-a em seu próprio shell)
fonte
i=0
eecho
não deve ser incluído na sua contagem de bytes?Lua , 52 bytes
Experimente online!
fonte
f
empcall
.--
que você pode confirmar que ele ainda é uma chamada recursiva sem otimizaçõesq / kdb +, 16 bytes
Solução:
Exemplo:
Explicação:
Tente recuar, aumente x em um a cada vez, se houver erro, retorne x.
fonte
Excel-VBA, 26 bytes
Não a profundidade da recursão propriamente dita, na verdade, gera o número máximo de iterações para uma célula em uma planilha do Excel. Dado que a saída pertence a um idioma diferente daquele em que está escrito, talvez isso seja mais apropriado:
Excel + Excel-Vba, 3 + 38 = 41 bytes
Como isso pode ser chamado de uma célula com
Para VBA sem construído em:
Excel-VBA,
534440 bytes-9 como variável não precisa mais ser inicializada ou impressa
-4, já que a execução do código não precisa mais ser finalizada para evitar várias impressões
Chame com s na janela imediata, para a célula A1 da planilha
(o aviso demora um pouco para ser executado agora, adicione
Application.ScreenUpdating = False
primeiro)fonte
Lua ,
4537 bytesExperimente online!
Não sei com qual valor inicializar,
x
pois não sei o número de chamadas intermediárias que existem ...fonte
Clojure,
725548 bytes-23 bytes, livrando-se do átomo
-7 bytes graças a @madstap. Passou a usar
fn
maisdef
e#()
, epr
maisprintln
.Escrevi e testei no meu telefone. O aplicativo REPL Clojure me deu uma profundidade de 13087.
Solução básica. Recursar até que uma SO seja lançada, incrementando um contador a cada recursão. Quando é lançado, o valor do contador é impresso.
fonte
pr
vez deprintln
. Também -2 bytes, tornando o fn assim: em((fn f[x](,,,))0)
vez de(def f #(,,,))(f 0)
.VBA, qualquer tipo,
4139 bytesLigue usando
?A()
na janela Imediata ou como função da planilha.Nota: Retorna 4613 no Excel-VBA, enquanto a resposta de @Greedo retorna 3666 no meu sistema (o mais alto deve ser o máximo). Aparentemente, também varia entre os programas do Office (o Access-VBA retorna 4622, o Word-VBA 4615)
Editar: acho que o VBA adiciona automaticamente parênteses, então as removeu.
fonte
Pitão - 9 bytes
Se eu puder executá-lo como a resposta J acima, isso significa 7 bytes, porque você pode remover o último
yZ
.Experimente online aqui .
fonte
764
, mas você está certo na maioria das vezes não dá saída.Quarto, 48 bytes
Loops até atingir o limite.
Experimente online
fonte
Tcl , 18 bytes
Experimente online!
recursionlimit
pode ser abreviado parar
Tcl , 31 bytes
Experimente online!
fonte
Tcl , 49 bytes
Experimente online!
fonte
Ruby, 39 bytes
Suprimir a mensagem de erro é um pouco menor do que resgatá-la, pois, por padrão,
rescue
não é detectadaSystemStackError
.Há uma resposta mais brega se eu puder imprimir em unário, representando
n
n caracteres de nova linha consecutivos:Ruby, 35 bytes
fonte
Gelatina , 18 bytes
:( *
Experimente online!
Quão?
* Desde o Jelly que eu saiba:
(1) define o limite de recursão do Python antes de configurar grande parte de seu próprio intérprete e analisar o código a ser executado; e
(2) não tem como detectar erros do Python.
Não tenho certeza se existe uma maneira de avaliar com segurança o limite de recursão ou imprimi-lo, pois ele é descoberto, exceto para perguntar ao Python qual foi o valor definido ( Eu adoraria ver se isso pode ser feito!) E é isso que o código aqui faz:
fonte