f=_=>do{try{-~f()}catch(e){}}
- 2 octets enregistrés grâce à Neil.
Essayez-le ici ou utilisez l'extrait ci-dessous pour le tester avec evalau lieu de do.
console.log((f=_=>eval(`try{-~f()}catch(e){}`))())
Port Japt , 24 octets
Cela ne vaut pas vraiment la peine d'être publié comme une solution distincte car elle est essentiellement identique.
Ox`try\{-~rp()}¯t®(e)\{}
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.
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}`))())
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:
f=_=>f()
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 fappelé. Nous pouvons éviter l'erreur en trying à l' appel en fcontinu et catching quand il échoue:
f=_=>{try{f()}catch(e){}}
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 catchne fait rien. Essayons d'évaluer l' try / catchénoncé:
f=_=>eval(`try{f()}catch(e){}`)
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'est undefinedencore parce que le catchne fait rien. Heureusement pour nous -~undefined==1et -~n==n+1donc, en passant un -~devant l'appel f, nous avons essentiellement -~-~ ... -~-~undefined, avec un autre -~ajouté à chaque appel, nous indiquant le nombre de fois où il a fété appelé.
f=_=>eval(`try{-~f()}catch(e){}`)