# Ackermann Funktion



## eB_mark (10. November 2005)

Hallo an alle Progger!



Ich soll ein Programm schreiben....

Schreiben Sie ein Java-Programm, welches die sehr schnell wachsende Ackermann-Funktion
berechnet. Die Ackermann-Funktion ist folgendermaßen definiert:
ack(0,m) = m+1
ack(n+1,0) = ack(n,1)
ack(n+1,m+1) = ack(n, ack(n+1,m))


Ok das habe ich getan. Siehe unten....
Unser Übungsleiter meinte wenn man den befehl "Heap" einfügt dann hebt dieser die Begrenzung des Wertebereiches auf.
Leider bin ich noch am Anfang meiner Progger Karriere...und weiß leider nicht so richtig wie man das anstellt   
Hat jemand eine Idee oder kann sogar weiterhelfen?
*danke* 


/**
 * @version 1.0
 * @author  mark
 * @date 08.11.2005
 * @package dssz.io.*
 *
 *  Schreiben Sie ein Java-Programm, welches die sehr schnell wachsende Ackermann-Funktion
 *  berechnet. Die Ackermann-Funktion ist folgendermaßen definiert:
 *  ack(0,m) = m+1
 *  ack(n+1,0) = ack(n,1)
 *  ack(n+1,m+1) = ack(n, ack(n+1,m))
 */

import dssz.io.*;


public class Acker
{
   //Programm zur Berechnung von ackermann
   public static long ack (long n, long m )
  {
    //if
	if ( n == 0 )
      return m + 1;
    else

      if ( m == 0 )
        return ack( n - 1, 1 );
      else
        return ack( n - 1, ack(n, m - 1) );

  }//end if
  //Unterprogramm zum Einlesen und Ausgeben
  public static void main( String args[] )
  {
    // Vereinbarungen
	stdin in=new stdin();
	// Variablen werden deklariert

	int x, y;
    // Varibale x wird eingelesen
	x = stdin.getInt("Geben Sie die erste Zahl ein : ");
    // Variable y wird eingelesen
	y = stdin.getInt("Geben Sie jetzt die zweite Zahl ein : ");

       //Ausgabe
	  System.out.println( "ack(" + x + "," + y + ")=" + ack(x,y) );
  }//end main
}//end class


----------



## Thomas Darimont (10. November 2005)

Hallo!


```
/**
   * 
   */
  package de.tutorials;
  
  public class Acker {
  	// Programm zur Berechnung von ackermann
  	public static long ack(long n, long m) {
  		// if
  		if (n == 0)
  			return m + 1;
  		else
  
  		if (m == 0)
  			return ack(n - 1, 1);
  		else
  			return ack(n - 1, ack(n, m - 1));
  
  	}// end if
  	// Unterprogramm zum Einlesen und Ausgeben
  	public static void main(String args[]) {
  		new Thread() {
  			public void run() {
  
  				int x = 3, y = 13;
  
  				// Ausgabe
 				long time = -System.currentTimeMillis();
 		 	System.out.println("ack(" + x + "," + y + ")=" + ack(x, y));
 		 	System.out.println((time+ System.currentTimeMillis()) + "ms");
  			}
  		}.start();
  	}
  }
```
  java -Xss8m de.tutorials.Acker

 Man muss einen neuen Thread starten, da der Parameter (-Xss8m -> Setzt die Thread-Stackgröße auf 8 MB) die Thread-Stackgröße nur für alle Threads ausser dem Main-Thread setzt.



> ack(3,13)=65533
> 78562ms


 
  Gruss Tom


----------



## eB_mark (11. November 2005)

danke dir thomas für die antwort...
nur leider weiß ich nicht so richtig wie ich das implementieren kann.
könntest du noch eine kleinere hilfe geben?
...so weit fortgeschritten bin ich leider noch nicht


----------



## MasterHimself (11. November 2005)

Da die Methode ack() static ist kannst du sie so aufrufen:

long ergebnis;
ergebnis = Acker.ack(n,m);

Grüße


----------

