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:

  1. Was passiert, wenn Sie die Abbruchbedingung (kandidat>1) weglassen und teste(kandidat-1); ohne Bedingung aufrufen?
  2. Verlagern Sie die Abbruchbedingung vor die Untersuchung. Was ändert sich?
  3. Verlagern Sie die Abbruchbedingung an den alten Ort und versuchen Sie dasselbe Resultat auf andere Weise zu erreichen.
  4. Übergeben Sie die Variable "deine Zahl" als zweiten Parameter an die Methode "teste" .