Hier erst einmal die Definition der Ackermannschen Funktion.
Code:
m = 0 ==> A(0, n) = n+1
m > 0, n = 0 ==> A(m, 0) = A(m-1, 1)
m > 0, n > 0 ==> A(m, n) = A(m-1, A(m, n-1))
Dass heisst, dass die Ausgangswerte
m und
n immer größer oder gleich Null (m=>0; n=>0) sein müssen. Aufgrund dieser Festlegung können diese auch nicht kleiner Null werden.
Wenn
m null erreicht liefert die Funktion den Nachfolger von
n zurück.
Ansonsten:
Wenn
n null erreicht liefert die Funktion den Nachfolger von
A(m-1, 1) zurück.
Ansonsten:
Ist das Ergebnis
A(m-1, A(m, n-1))
Darin lag auch der Fehler in der Lösung von
Phoenix. Du überprüfst zuerst, ob
n (y) Null erreicht hat!, aber Du musst zuerst
m (x) überprüfen. Dann können die Zahlen auch nie negativ werden.
Es stimmt allerdings, dass diese Funktion schnell die Grenzen des Stacks erreichen kann - (mehr oder weniger) deshalb wurde diese auch entwickelt.
...
...
P.S. Hier noch ein Link:
http://www.kosara.net/thoughts/ackermann.html