Bei der Rekursion oder rekursiven Programmierung ruft sich eine Methode selbst wieder auf.
In diesem Artikel lernst Du den Aufbau von rekursiven Methoden und deren Anwendung kennen.
Um Rekursion zu verstehen muß der Umgang mit Methoden sitzen. Deshalb zu Beginn nochmal eine kurze Wiederholung. Nehmen wir folgende bekannte Methoden:
public static void main(String[] args) {...}
static int berechneSaftmenge(int orangenzahl){...}
Nun testen wir den Methodenaufruf. Bestimme für jede der gegebenen Methoden einen möglichen Aufruf:
public static void presseOrangen(int a){}
public static int presseOrangen(int a){}
public static void presseOrangen(int a){
presseOrangen(a-1);
}
Funktioniert der letzte Methodenaufruf überhaupt?
Wir betrachten folgendes Beispiel:
private static void pushUp(int amount) { if(amount == 0) return; System.out.println("1mal geschafft. Noch "+(amount-1)+"!"); pushUp(amount-1); }
Der Methode wird eine bestimmte Anzahl übergeben. Die Methode ruft sich dabei immer wieder selbst auf. Um keine endlose Wiederholung zu erhalten, muss es ein Ende geben. Dies wird durch die zwei folgenden Punkte erreicht
Mit Hilfe der Rekursion lassen sich wiederholte Abläufe programmieren. Wie ein Spiegelbild im Spiegel ähnelt Rekursion einer Schleife, jedoch können hiermit auch deutlich komplexere Berechnungen, wie wir nachher sehen, gelöst werden. Anderseits ist der Programmablauf bei einer Rekursion oft nicht leicht zu verstehen.
Autoren: D. Skoda, D. Supper
Die Fakultät ist eine mathematische Funktion, welche eine natürlichen Zahl das Produkt aus dieser und aller kleineren natürlichen Zahlen (≥ 1) zuordnet.
07-Rekursion
an.Fakultaet
in welcher der Benutzer die Höhe der Fakultät eingibt.void notiereFakultaet(int n){ ... }
. Die Methode soll bei der Zahl 6 folgende Ausgabe rekursiv erzeugen:int berechneFakultaet(int n){ ... }
den Wert der Fakultät. Der Fakultätswert wird rekursiv berechnet und dann zurückgegeben. return n * berechneFakultaet(n-1);
Die Ausgabe sollte wie folgt aussehen:
Nenne die Anzahl: 6
6! = 6 ⋅ 5 ⋅ 4 ⋅ 3 ⋅ 2 ⋅ 1 = 720
Bestimme den Quelltext, damit alle Zahlen von a bis 0 addiert werden. Wähle eine Antwort.
int add(int a){...}
if(a>0) return a-add(a); else return 0;
if(a>0) return a/add(a+1); else return a;
if(a>0) return a+add(a-1); else return 0;
if(a<0) return a+add(a-1); else return 0;
Bestimme den Quelltext, damit alle Zahlen von a bis 1 dividiert werden. Wähle eine Antwort.
static double add(double a){...}
if(a>1) return a/add(a-1); else return 0;
if(a>1) return a/add(a-1); else return 1;
if(a>1) return a/add(a+1); else return 1;
if(a<1) return a-add(a-1); else return 2;
Quellen:
Dean Skoda, EFS220, Elektronikschule Tettnang, 2022
Hans U. Simon, Ruhr-Universität Bochum, Germany, 2004
https://de.wikipedia.org/wiki/Ackermannfunktion
Im Jahre 1928 präsentierte Wilhelm Ackermann eine Funktion, die sogenannte Ackermannfunktion:
$a(0, y) = y + 1$ für alle $y\ge0$
$a(x, 0) = a(x − 1, 1)$ für alle $x ≥ 1$
$a(x, y) = a(x − 1, a(x, y − 1))$ für alle $x, y ≥ 1$
Ackermann
und definiere die Methode private static int ack(int x, int y)
. Programmiere mit Hilfe des Pseudocodes und überprüfe Deine Ergebnisse.
function ack(x, y)
if x = 0
return y + 1
else if y = 0
return ack(x - 1, 1)
else
return ack(x - 1, ack(x, y - 1))
Um Rekursion zu verstehen, muß man zunächst Rekursion verstehen.
die Methode, -n | Eine Methode ist ein ausgelagerter Programmteil. |
die Rekursion, -en | innerhalb einer Methode wird die identische Methode nochmals aufgerufen. |