La funzione di Ackermann è nota per essere uno degli esempi più semplici di una funzione totale e calcolabile che non è ricorsiva primitiva.
Useremo la definizione di A(m,n)
prendere due interi non negativi dove
A(0,n) = n+1
A(m,0) = A(m-1,1)
A(m,n) = A(m-1,A(m,n-1))
È possibile implementare
- una funzione nominata o anonima che accetta due numeri interi come input, che restituisce un numero intero o
- un programma che prende due interi separati da spazio o newline su STDIN, stampando un risultato su STDOUT.
Non è possibile utilizzare una funzione di Ackermann o una funzione di iperesponenziazione da una libreria, se presente, ma è possibile utilizzare qualsiasi altra funzione di qualsiasi altra libreria. È ammessa l'espiazione regolare.
La tua funzione deve essere in grado di trovare il valore di A(m,n)
per m ≤ 3 e n ≤ 10 in meno di un minuto. Dovrebbe almeno teoricamente terminare su qualsiasi altro input: dato lo spazio di stack infinito, un tipo di Bigint nativo e un periodo di tempo arbitrariamente lungo, restituirebbe la risposta. Modifica: se la tua lingua ha una profondità di ricorsione predefinita troppo restrittiva, puoi riconfigurarla senza alcun costo di carattere.
Vince l'invio con il minor numero di personaggi.
Ecco alcuni valori, per verificare la tua risposta:
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 superiore in modo ingenuo come gli altri? Devo trovare una soluzione di non ricorsione o in questi casi posso anche solo "assumere uno spazio di stack infinito"? Ne sono abbastanza certo, terminerebbe entro un minuto.