Rekursion (1)
Berechnung der Teiler einer natürliche Zahl
Schleifen haben Sie bis jetzt als "Iteration" (Wiederholung) programmiert.
Nehmen wir als Beispiel ein Programm, das alle Teiler einer gegebenen
natürlichen Zahl ausdruckt:
import java.util.*;
public class Teiler_iterativ {
public static void main(String[] args) {
Scanner Eingabe = new Scanner(System.in);
System.out.println("Teiler einer natürlichen Zahl");
System.out.print("\nGib bitte eine Zahl ein: ");
int zahl = Eingabe.nextInt();
System.out.print("Bitte sehr: ");
for (int i=zahl; i>0; i--) {
if (zahl%i==0) {
System.out.print(i+" ");
}
}
System.out.println();
}
}
Das folgende Programm demonstriert das Verfahren der "Rekursion" (Rückgriff). Das bedeutet, dass eine Methode sich mit veränderten Parametern selbst aufruft. Das Verfahren bleibt dabei in jedem Durchgang dasselbe. Vergleichen Sie:
import java.util.*;
public class Teiler_rekursiv {
static int zahl; // Globale Variable (für alle Methoden sichtbar)
static void teste(int kandidat) {
if (zahl % kandidat == 0) {
// Methode greift auf globale Variable (zahl)
System.out.print(kandidat+" ");
// und lokale Variable (kandidat) zu
}
if (kandidat>1) {
// Abbruchbedingung
teste(kandidat-1);
// Rekursion: Die Methode ruft sich
}
// mit veränderten Parametern selbst auf
}
public static void main(String[] args) {
Scanner Eingabe = new Scanner(System.in);
System.out.println("Teiler einer natürlichen Zahl");
System.out.print("\nGib bitte eine Zahl ein: ");
zahl = Eingabe.nextInt();
System.out.print("Bitte sehr: ");
teste(zahl);
// Der erste Kandidat ist die Zahl selbst
System.out.println();
}
}
Bei unserem Problem erscheint die Rekursion auf den
ersten Blick umständlicher als die Iteration. Das ist aber nicht immer
so.
Manche Probleme lassen sich mit Rekursion sehr viel eleganter als mit Iteration programmieren.
Aufgaben: