class Ackermann
{
  /* Die Ackermannsche Funktion A ist fuer alle ganzen,
     nichtnegativen m und n definiert durch:
     A(0,n) = n+1
     A(m,0) = A(m-1,1)         fuer m > 0
     A(m,n) = A(m-1, A(m,n-1)) fuer m, n > 0
     (aus: Niklaus Wirth, Algorithmen und Datenstrukturen)
     Achtung: Die rekursive Formulierung zwingt jeden Rechner
              in die Knie! m=3 und n=10 sind schon problematisch.
              Bei m=4 werden die Rechenzeiten unertraeglich oder
              der Rechner stoppt mit einem Laufzeitfehler.
              A(4,2) hat schon 19.729 Stellen. long hilft auch
              nicht weiter, dann laeuft der Speicher schon bei
              A(3,10) voll.
  */

  static int ackermann(int m, int n)
  {  if (m==0)
          return n+1;
      else if (n==0)
          return ackermann(m-1, 1); 
      else return ackermann(m-1, ackermann(m,n-1)); 
  } // ackermann

  static void formatierteAusgabe(int x, int laenge)
  {
   String s = ""+x;
   int spaces = laenge-s.length();
   for (int i=1; i<=spaces; i++) Out.print(" ");
   Out.print(x);
  } // formatierteAusgabe

  public static void main(String args[]) // Hauptprogramm
  {  Out.println("Die Ausgabe der Ackermann-Folge ");
     Out.print ("n =   : ");
     for (int n=0; n<=10; n++) formatierteAusgabe(n, 5);
     Out.println();
     Out.println();
     for (int m=0; m<=3; m++)
     {  Out.print("m = "+m+" : ");
        for (int n=0; n<=9; n++)
          { formatierteAusgabe(ackermann(m,n), 5); }
        Out.println();
     } // for m
     Out.println();
  } // Ende von main
} // Ende von class Ackermann

