A função Ackermann é notável por ser um dos exemplos mais simples de uma função computável total que não é recursiva primitiva.
Usaremos a definição de A(m,n)
obter dois números inteiros não negativos onde
A(0,n) = n+1
A(m,0) = A(m-1,1)
A(m,n) = A(m-1,A(m,n-1))
Você pode implementar
- uma função nomeada ou anônima, recebendo dois números inteiros como entrada, retornando um número inteiro ou
- um programa que usa dois números inteiros separados por espaço ou nova linha em STDIN, imprimindo um resultado em STDOUT.
Você não pode usar uma função Ackermann ou uma função de hiperexponenciação de uma biblioteca, se houver, mas você pode usar qualquer outra função de qualquer outra biblioteca. Exponenciação regular é permitida.
Sua função deve ser capaz de encontrar o valor de A(m,n)
para m ≤ 3 en n ≤ 10 em menos de um minuto. Ele deve pelo menos terminar teoricamente em quaisquer outras entradas: dado o espaço infinito da pilha, um tipo nativo de Bigint e um período arbitrariamente longo, ele retornaria a resposta. Editar: se o seu idioma tiver uma profundidade de recursão padrão muito restritiva, você poderá reconfigurá-lo sem nenhum custo de caracteres.
A submissão com o menor número de caracteres vence.
Aqui estão alguns valores, para verificar sua resposta:
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)
e acima tão ingênuo quanto os outros? Preciso criar uma solução sem recursão ou também posso "assumir espaço de pilha infinito" nesses casos? Estou bastante certo de que terminaria em um minuto.