Votre langue a-t-elle une profondeur de récursivité maximale (MRD)?
Disons que votre langue a MRD = 500
Écrivez un code qui trouve la profondeur de récursivité et génère la valeur exacte
Pour le cas ci-dessus, votre programme (ou fonction) devrait produire 500
Code-Golf La réponse la plus courte gagne!
Réponses:
Mathematica, 15 octets
¯ \ _ (ツ) _ / ¯
Essayez-le en ligne!
la source
Python 3 , 40 octets
Essayez-le en ligne!
Sans simplement le lire depuis le builtin. Nous commençons à 2 au lieu de 1 parce que la clause except est exécutée un niveau avant qu'elle ne génère d'erreurs. C'est un octet plus court en python 2, bien sûr.
la source
JavaScript (Babel) ,
353329 octetsEssayez-le ici ou utilisez l'extrait ci-dessous pour le tester avec
eval
au lieu dedo
.Port Japt , 24 octets
Cela ne vaut pas vraiment la peine d'être publié comme une solution distincte car elle est essentiellement identique.
Essaye-le
Explication
JavaScript lui-même n'a pas de limite de récursivité en soi, mais la limite est imposée par l'interpréteur (c'est-à-dire le navigateur) - c'est une bonne chose que nous définissions les langues par leur interprète ici! Entre autres facteurs, la limite peut varier selon le navigateur et la mémoire disponible, ce qui est affecté par les opérations effectuées. L'extrait suivant illustre ce dernier point, en utilisant les 5 versions différentes de cette solution que j'ai utilisées. Comme vous pouvez le voir sur les 2 derniers tests, dans Chrome, au moins, même l'ordre des opérations peut faire la différence.
Compte tenu de cela, nous n'avons donc pas la commodité d'une constante ou d'une méthode avec laquelle travailler. Au lieu de cela, nous allons créer une fonction qui s'appelle elle-même en continu avant, éventuellement, de craquer. Dans sa forme la plus simple qui soit:
Mais cela ne nous est pas très utile pour ce défi car il ne génère qu'une erreur de débordement sans indication du nombre de fois où il s'est
f
appelé. Nous pouvons éviter l'erreur entry
ing à l' appel enf
continu etcatch
ing quand il échoue:Aucune erreur, mais toujours pas de valeur de retour du nombre de fois où la fonction a réussi à s'appeler avant d'échouer, car le
catch
ne fait rien. Essayons d'évaluer l'try / catch
énoncé:Maintenant, nous avons une valeur renvoyée (et, comme il s'agit du code golf, nous nous sommes épargnés de quelques octets en utilisant un réel
return
). La valeur renvoyée, cependant, l'estundefined
encore parce que lecatch
ne fait rien. Heureusement pour nous-~undefined==1
et-~n==n+1
donc, en passant un-~
devant l'appelf
, nous avons essentiellement-~-~ ... -~-~undefined
, avec un autre-~
ajouté à chaque appel, nous indiquant le nombre de fois où il af
été appelé.la source
f=_=>eval('try{-~f()}catch(e){}')
Mathematica (pas intégré), 20 octets
Omettre le
;
calculera1+$IterationLimit
(probablement parce que Mathematica optimise la fonction). Vous pouvez également0 //. x_ -> x + 1
calculerReplaceRepeated
la valeur par défautMaxIteration
, c'est-à-dire65536
(qui est supérieure à la valeur ci-dessus).(Il s'agit d'un extrait de code qui évalue le résultat. Cependant, l'autre solution Mathematica l'est également)
la source
J, 8 octets
Essayez-le en ligne!
Donc, je ne sais pas vraiment comment exécuter un verbe sans aucune entrée et une brève recherche (ainsi qu'une intuition personnelle) donne l'impression que ce n'est pas possible. Si c'est le cas, faites-le moi savoir et je supprimerai ou mettrai à jour ma réponse. Cela n'a pas vraiment de sens de ne pas donner d'entrée à un verbe. À la lumière de cela, la fonction donnée attend
0
, l'entrée "vide" par défaut pour les entiers. Je peux probablement le changer pour utiliser le tableau vide (0$0
) si vous pensez que cela convient mieux.Edit: l'OP a permis à la fonction de prendre 0.
Explication
Cela s'appelle récursivement, en ajoutant 1 à l'entrée (0 attendu) jusqu'à ce qu'il rencontre une erreur de pile. Lorsqu'il commet une erreur, il appelle le contraire (
]
opposé -droite identité) sur l'entrée, qui est juste 0.À propos, l'espace est nécessaire .
la source
(1+$: ::]) 0
Python 3 ,
4132 octetsEssayez-le en ligne!
9 octets enregistrés grâce à @FryAmTheEggman!
34 octets
35 octets
Les 2 derniers grâce à @totallyhuman
la source
C (gcc, x64 Linux),
180133 bytes-4 octets grâce à @scottinet
Essayez-le en ligne!
Installe un gestionnaire SIGSEGV (signal 11) avec une autre pile de signaux (la taille minimale
MINSIGSTKSZ
est de 2 Ko, l'indicateurSA_ONSTACK
est 0x08000000), puis appelle une fonction sans arguments et sans variables locales récursivement jusqu'à ce que la pile déborde. Il est intéressant de noter que la profondeur de récursivité maximale varie d'une série à l'autre, probablement en raison de l'ASLR.La profondeur de récursivité maximale en C dépend bien sûr de nombreux facteurs. Sur un système Linux 64 bits typique, la taille de pile par défaut est de 8 Mo et l'alignement de la pile est de 16 octets, vous obtenez donc une profondeur de récursivité d'environ 512 Ko pour les fonctions simples.
Notez également que le programme ci-dessus ne fonctionne pas en
-O2
raison de l'optimisation des appels de queue.la source
c
et en appelantexit
et ensigaction
tant que paramètres. Cela ne fait aucune différence notable sur le résultat: lien TIOJava 8,
13151484743 octets-80 octets grâce à @Nevay . J'ai aussi essayé une méthode au lieu d'un programme, mais j'ai fait une erreur, donc j'ai fini avec un programme complet. Maintenant c'est une méthode.
-3 octets grâce à @Neil en utilisant
finally
au lieu decatch(Error e)
.-5 octets grâce à @Nevay .
Explication:
Essayez-le ici.
la source
int c(){try{return-~c();}catch(Error e){return 1;}}
int c(){int n=1;try{n=-~c();}finally{return n;}}
enregistre 3 octets mais me donne une réponse différente?int c(){int n=1;try{n+=c();}finally{return n;}}
int d;int c(){try{c();}finally{return++d;}}
Octave, 19 octets
Usage:
la source
R ,
322618 octets-8 octets grâce à Sven Hohenstein :
$
fera une correspondance partielle, donc nous pouvons simplement utiliser à laexp
place du pleinexpressions
.La
options
commande peut également être utilisée pour définir la profondeur de récursivité, c'est-à-direoptions(expressions=500)
pour 500.Essayez-le en ligne!
la source
ressions
raison d'une correspondance partielle avec$
.Octave ,
252220 octets2 octets supprimés grâce à une suggestion de Sanchises
Fonction anonyme qui génère la valeur.
Essayez-le en ligne!
la source
()
, commemax_recursion_depth
c'est aussi une fonction.@
pour la garder distincte (définir une fonction plutôt que de RÉPLIQUER le résultat).disp
(je l'aurais inclus, mais c'est mon opinion personnelle sur Octave REPL, et je ne suis pas sûr d'un méta consensus à ce sujet)zsh, 24 octets
Essayez-le en ligne! (Voir sous débogage)
bash, 24 octets
Essayez-le en ligne! (Voir sous débogage)
ksh93, 27 octets
Essayez-le en ligne! (Voir sous débogage)
tiret, 27 octets
Essayez-le en ligne! (Dépasse la sortie de débogage de tio, exécutez-le dans votre propre shell)
la source
i=0
etecho
ne doit pas être inclus dans votre nombre d'octets?Lua , 52 octets
Essayez-le en ligne!
la source
f
danspcall
.--
vous pouvez confirmer qu'il s'agit toujours d'un appel récursif sans optimisationq / kdb +, 16 octets
Solution:
Exemple:
Explication:
Essayez de reprendre, augmentez x de un à chaque fois, si erreur, retournez x.
la source
Excel-VBA, 26 octets
Pas la profondeur de récursivité en soi, cela génère en fait le nombre maximal d'itérations pour une cellule dans une feuille de calcul Excel. Étant donné que la sortie se rapporte à une langue autre que la langue dans laquelle cela est écrit, c'est peut-être plus approprié:
Excel + Excel-Vba, 3 + 38 = 41 octets
Comme cela peut être appelé depuis une cellule avec
Pour VBA sans intégré:
Excel-VBA,
534440 octets-9 car la variable n'a plus besoin d'être initialisée ou imprimée
-4 car l'exécution du code ne doit plus être terminée pour éviter les impressions multiples
Appelez avec s dans la fenêtre immédiate, affiche la cellule A1 de la feuille de calcul
(l'avertissement prend un certain temps pour s'exécuter maintenant, ajoutez d'
Application.ScreenUpdating = False
abord)la source
Lua ,
4537 octetsEssayez-le en ligne!
Je ne sais pas avec quelle valeur initialiser
x
car je ne connais pas le nombre d'appels intermédiaires ...la source
Clojure,
725548 octets-23 octets en se débarrassant de l'atome
-7 octets grâce à @madstap. Passé à l'utilisation de
fn
overdef
et#()
, andpr
overprintln
.Écrit et testé sur mon téléphone. L'application Clojure REPL m'a donné une profondeur de 13087.
Solution basique. Réexaminez jusqu'à ce qu'un SO soit lancé, en incrémentant un compteur à chaque récursif. Lorsqu'il est lancé, la valeur du compteur est imprimée.
la source
pr
au lieu deprintln
. Aussi -2 octets en faisant le fn comme ceci:((fn f[x](,,,))0)
au lieu de(def f #(,,,))(f 0)
.VBA, tout type,
4139 octetsAppelez en utilisant
?A()
dans la fenêtre Exécution ou en tant que fonction de feuille de calcul.Remarque: Renvoie 4613 dans Excel-VBA, tandis que la réponse de @Greedo renvoie 3666 sur mon système (le plus élevé devrait être le maximum). Apparemment, varie également entre les programmes Office (Access-VBA renvoie 4622, Word-VBA 4615)
Edit: Devinez VBA ajoute automatiquement des parenthèses, alors supprimez-les.
la source
Pyth - 9 octets
Si je peux l'exécuter comme la réponse J ci-dessus, c'est 7 octets car vous pouvez supprimer le dernier
yZ
.Essayez-le en ligne ici .
la source
764
, mais vous avez raison la plupart du temps, il ne donne aucune sortie.Forth, 48 octets
Boucles jusqu'à ce qu'il atteigne la limite.
Essayez-le en ligne
la source
Tcl , 18 octets
Essayez-le en ligne!
recursionlimit
peut être abrégé enr
Tcl , 31 octets
Essayez-le en ligne!
la source
Tcl , 49 octets
Essayez-le en ligne!
la source
Rubis, 39 octets
La suppression du message d'erreur est un peu plus courte que le sauvetage, car par défaut
rescue
il ne prend pasSystemStackError
.Il y a une réponse plus ringarde si je peux produire en unaire, représentant
n
avec n caractères de nouvelle ligne consécutifs:Rubis, 35 octets
la source
Gelée , 18 octets
:( *
Essayez-le en ligne!
Comment?
* Depuis Jelly pour autant que je sache:
(1) définit la limite de récursivité Python avant de configurer une grande partie de son propre interpréteur et d'analyser le code à exécuter; et
(2) n'a aucun moyen d'attraper les erreurs Python,
je ne suis pas sûr s'il existe un moyen d'évaluer de manière fiable la limite de récursivité ou de l'imprimer lorsqu'elle est découverte autrement que de demander à Python quelle valeur a été définie ( J'aimerais voir si cela peut être fait!), C'est donc ce que fait le code ici:
la source