La fonction Ackermann est remarquable pour être l’un des exemples les plus simples d’une fonction totale calculable qui n’est pas récursive primitive.
Nous allons utiliser la définition de la A(m,n)
prise en deux entiers non négatifs où
A(0,n) = n+1
A(m,0) = A(m-1,1)
A(m,n) = A(m-1,A(m,n-1))
Vous pouvez implémenter
- une fonction nommée ou anonyme prenant deux entiers en entrée, renvoyant un entier, ou
- un programme prenant deux entiers séparés par une ligne ou un espace sur STDIN, en imprimant un résultat vers STDOUT.
Vous ne pouvez pas utiliser une fonction Ackermann ou une fonction d'hyperexponentiation d'une bibliothèque, s'il en existe une, mais vous pouvez utiliser toute autre fonction d'une autre bibliothèque. Une exponentiation régulière est autorisée.
Votre fonction doit pouvoir trouver la valeur de A(m,n)
pour m ≤ 3 et n ≤ 10 en moins d'une minute. Il doit au moins théoriquement se terminer par toute autre entrée: avec un espace de pile infini, un type Bigint natif et une période de temps arbitrairement longue, la réponse sera renvoyée. Éditer: Si votre langue a une profondeur de récursion par défaut trop restrictive, vous pouvez la reconfigurer sans frais de caractères.
La soumission avec le plus petit nombre de caractères gagne.
Voici quelques valeurs pour vérifier votre réponse:
A | n=0 1 2 3 4 5 6 7 8 9 10
-----+-----------------------------------------------------------------
m=0 | 1 2 3 4 5 6 7 8 9 10 11
1 | 2 3 4 5 6 7 8 9 10 11 12
2 | 3 5 7 9 11 13 15 17 19 21 23
3 | 5 13 29 61 125 253 509 1021 2045 4093 8189
4 | 13 65533 big really big...
A(3,8)
et supérieure aussi naïvement que les autres? Dois-je proposer une solution de non-récursion ou puis-je simplement "supposer un espace infini" dans ces cas? Je suis assez certain, cela se terminerait dans une minute.