Die Ackermann-Funktion ist eines der einfachsten Beispiele für eine vollständig berechenbare Funktion, die nicht primitiv rekursiv ist.
Wir werden die Definition von A(m,n)
zwei nichtnegativen ganzen Zahlen verwenden, bei denen
A(0,n) = n+1
A(m,0) = A(m-1,1)
A(m,n) = A(m-1,A(m,n-1))
Sie können implementieren
- eine benannte oder anonyme Funktion, die zwei Ganzzahlen als Eingabe verwendet und eine Ganzzahl zurückgibt, oder
- Ein Programm, das zwei durch Leerzeichen oder Zeilenumbrüche getrennte Ganzzahlen in STDIN verwendet und ein Ergebnis in STDOUT ausgibt.
Sie dürfen keine Ackermann-Funktion oder Überkompensationsfunktion aus einer Bibliothek verwenden, sofern eine vorhanden ist, aber Sie dürfen jede andere Funktion aus einer anderen Bibliothek verwenden. Regelmäßige Potenzierung ist zulässig.
Ihre Funktion muss in der Lage sein, den Wert A(m,n)
für m ≤ 3 und n ≤ 10 in weniger als einer Minute zu finden. Es muss zumindest theoretisch bei allen anderen Eingaben enden: Bei einem unendlichen Stapelspeicherplatz, einem systemeigenen Bigint-Typ und einem beliebig langen Zeitraum würde es die Antwort zurückgeben. Bearbeiten: Wenn Ihre Sprache eine zu restriktive Standard-Rekursionstiefe hat, können Sie diese ohne Zeichenkosten neu konfigurieren.
Die Einsendung mit der kürzesten Anzahl von Zeichen gewinnt.
Hier sind einige Werte, um Ihre Antwort zu überprüfen:
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)
so naiv wie die anderen zu rechnen ? Muss ich mir eine nicht rekursive Lösung einfallen lassen, oder kann ich in diesen Fällen auch nur "unendlichen Stapelspeicher annehmen"? Ich bin mir ziemlich sicher, es würde innerhalb einer Minute enden.