Ackermann Funktion

eB_mark

Grünschnabel
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
 
Hallo!

Code:
  /**
   * 
   */
  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
 
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
 
Zurück