La función de Ackermann es notable por ser uno de los ejemplos más simples de una función total y computable que no es primitiva recursiva.
Usaremos la definición de A(m,n)
tomar dos enteros no negativos donde
A(0,n) = n+1
A(m,0) = A(m-1,1)
A(m,n) = A(m-1,A(m,n-1))
Puedes implementar
- una función con nombre o anónima que toma dos enteros como entrada, devuelve un entero o
- un programa que toma dos enteros separados por espacios o líneas nuevas en STDIN, imprimiendo un resultado en STDOUT.
No puede usar una función de Ackermann o una función de hiperexponenciación de una biblioteca, si existe, pero puede usar cualquier otra función de cualquier otra biblioteca. Se permite la exponenciación regular.
Su función debe poder encontrar el valor de A(m,n)
para m ≤ 3 yn ≤ 10 en menos de un minuto. Al menos debe terminar teóricamente en cualquier otra entrada: dado un espacio de pila infinito, un tipo Bigint nativo y un período de tiempo arbitrariamente largo, devolvería la respuesta. Editar: si su idioma tiene una profundidad de recursión predeterminada que es demasiado restrictiva, puede reconfigurarla sin costo de caracteres.
La presentación con el menor número de caracteres gana.
Aquí hay algunos valores, para verificar su respuesta:
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)
y es tan ingenuo como los demás? ¿Tengo que encontrar una solución que no sea de recursión, o también puedo "asumir un espacio de pila infinito" en estos casos? Estoy bastante seguro de que terminaría en un minuto.