Rekursion

El Hadji

Bekanntes Mitglied
Servus Communtiy,
Ich habe nach wie vor ziemliche Schwierigkeiten mir Rekursion vorzustellen. Ich habe hier eines der leichtesten Rekursionsbeispiele inklusive Code ich wäre euch sehr dankbar wenn ihr mir hiermit näher bringen könnt was Rekursion genau macht.

Beispiel ist einfach ein Hanoi-Spiel, 3 Stäbe, auf dem 1 Stab sind n Scheiben der Größe nach geordnet und man muss sie alle auf den 3ten Stab bringen.

Code:
    public static ArrayList<String> getHanoiSequence(int n)
    {
        bewegungen = new ArrayList<String>();
        String stabA = "A";
        String stabB = "B";
        String stabC = "C";
        hanoi(stabA,stabB,stabC,n);
        return bewegungen;
    }
   
    // auf Stab A liegen die n kleinsten Scheiben
   
    public static void hanoi(String stabA,String stabB,String stabC,int n)
    {
        if(n == 0) return;
        {
           
            hanoi(stabA,stabC,stabB,n-1);
            bewegungen.add(stabA+stabC);
            hanoi(stabB,stabA,stabC,n-1);
        }
    }
      
}

Nur verstehe ich nicht ganz wie in der Rekursion ein Methodenaufruf funktioniert. Natürlich gibt es den besten Fall und n ist gleich 0 also die Abbruchbedingungen. Aber danach rufe ich jedes Mal wieder die Methode auf und würde ja nie zubewegungen.add kommen oder wie läuft das ab.

mfg El Hadji
 

Nuiton

Bekanntes Mitglied
Ich finde nicht dass die Tuerme von Hanoi ein sehr empfehlendes Beispiel zum verstehen der Rekursion dient. Ein leichteres Beispiel waere z.B. Fakultaeten, exponentielle Funktionen (bzw. Math.pow()), oder Fibonacci.

Meine Frage ist: Was bringt dir das "stabA" und "stabB" einem String zu casten, und es schliesslich in eine ArrayList einzufuegen? Was hast du vor?
 

El Hadji

Bekanntes Mitglied
Ich habe nur das Rekursionbeispiel zur Verfügung und will es dadurch etwas besser verstehen für die nächsten. Die ArrayList soll einfach die Bewegungen ausgeben "AB" wenn eine Scheibe von Stab A auf Stab B geschoben wird
 

mrBrown

Super-Moderator
Mitarbeiter
Der Code ist dir so vorgegeben? Das ist das denkbar schlechteste Beispiel, ich hab ehrlich gesagt nicht mal Ahnung, was da passieren soll, das sieht eher falsch als richtig aus und hat auch nicht wirklich viel mit Türme von Hanoi zu tun?

Besser verstehen wirst du es damit kaum, eher mit den schon genannten Beispielen wie Fibonacci...
 

El Hadji

Bekanntes Mitglied
So, wir haben ein Beispiel in der Übung durchgemacht und das war genau dieses hier, jetzt versuch ich die anderen Beispiele zu lösen. Aber zuerst will ich mal verstehen was wir hier gemacht haben :)
 

mrBrown

Super-Moderator
Mitarbeiter
Das Beispiel ist einfach völliger Unsinn, wie es da oben steht, das hat auch mit der Beschreibung "alle auf den 3ten Stab bringen" nichts zu tun, es werden einfach nur immer zwei getauscht.

Dann die Liste Bewegungen, da werden A und C hinzugefügt, soll ja heißen, A und C werden getauscht, die werden aber nie getauscht, es wird B mit C und B mit A getauscht.

Und von den beiden Vertauschungen landet nur eine in der Liste, die Hälfte alle Bewegungen verschwindet also im Nirvana.


Rekursion kann man für Türme von Hanoi durchaus nutzen, aber dann nicht so umgesetzt.


Zu deinem Verständnis-Problem:
Nur verstehe ich nicht ganz wie in der Rekursion ein Methodenaufruf funktioniert. Natürlich gibt es den besten Fall und n ist gleich 0 also die Abbruchbedingungen. Aber danach rufe ich jedes Mal wieder die Methode auf und würde ja nie zubewegungen.add kommen oder wie läuft das ab.

Der erste Aufruf von hanoi(stabA,stabC,stabB,n-1); returned ja irgendwann (durch die Abbruchbedingung), dann wird bewegung.add(...); ausgeführt, und dann das zweite hanoi(...);, und dann returned das aktuelle hanoi.
Und eben dieses Schema lässt sich ohne das ganze Sinnlose drumherum dieses Hanois leichter verstehen, zB an Fibonacci oä.

Ist das 'ne Übung an 'ner Uni gewesen?
 

Meniskusschaden

Top Contributor
Das Programm funktioniert schon korrekt. Die Benennungen sind aber nicht gut verständlich. Vielleicht erkennt man es mit folgender Kommentierung etwas besser:
Java:
        hanoi(stabA, stabC, stabB, n - 1); // Bewege oberste n-1 Scheiben von A nach B
        bewegungen.add(stabA + stabC);     // Bewege oberste Scheibe von A nach C
        hanoi(stabB, stabA, stabC, n - 1); // Bewege oberste n-1 Scheiben von B nach C
Für n=3 bekommt man folgendes Ergebnis:
Code:
[AC, AB, CB, AC, BA, BC, AC]
 

mrBrown

Super-Moderator
Mitarbeiter
Das funktioniert wirklich? Ich hätte es mal ausprobieren sollen...
Das ist die unverständlichste Implementierung davon die ich je gesehen hab...
 

Meniskusschaden

Top Contributor
Du kannst dir ja mal zwischendurch etwas ausgeben lassen. Dadurch wird es vielleicht anschaulicher. Dieses Beispiel
Java:
public class Hanoi {
    private static final int N = 3;
    private static ArrayList<String> bewegungen;

    public static void main(String[] args) {
        getHanoiSequence(N);
        System.out.println(bewegungen);
    }

    public static ArrayList<String> getHanoiSequence(int n) {
        bewegungen = new ArrayList<String>();
        String stabA = "A";
        String stabB = "B";
        String stabC = "C";
        hanoi(stabA, stabB, stabC, n);
        return bewegungen;
    }

    public static void hanoi(String stabA, String stabB, String stabC, int n) {
        print(n, ">" + stabA + stabB + stabC);
        if (n == 0) {
            print(n, "<" + stabA + stabB + stabC);
            return;
        }

        hanoi(stabA, stabC, stabB, n - 1);
        print(n, "move " + stabA + "-" + stabC);
        bewegungen.add(stabA + stabC);
        hanoi(stabB, stabA, stabC, n - 1);
        print(n, "<" + stabA + stabB + stabC);
    }

    public static void print(int n, String s) {
        for (int i = 0; i < N - n; i++) {
            System.out.print(" ");
        }
        System.out.println(s);
    }
}
erzeugt folgendes Ergebnis:
Code:
>ABC
>ACB
  >ABC
   >ACB
   <ACB
  move A-C
   >BAC
   <BAC
  <ABC
move A-B
  >CAB
   >CBA
   <CBA
  move C-B
   >ACB
   <ACB
  <CAB
<ACB
move A-C
>BAC
  >BCA
   >BAC
   <BAC
  move B-A
   >CBA
   <CBA
  <BCA
move B-C
  >ABC
   >ACB
   <ACB
  move A-C
   >BAC
   <BAC
  <ABC
<BAC
<ABC
[AC, AB, CB, AC, BA, BC, AC]

EDIT: Beim Einfügen wurden offenbar ein paar Einrückungen verfälscht. Am besten ruft man es selbst auf.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Verstehe Rekursion nicht ganz Java Basics - Anfänger-Themen 7
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
M Variablen Rekursion mit 2 Parameteren Java Basics - Anfänger-Themen 4
sserio Rekursion größten Primfaktor finden funktioniert nicht Java Basics - Anfänger-Themen 8
M Lösungsweg Rekursion Java Basics - Anfänger-Themen 1
C StackOverflow bei Rekursion Java Basics - Anfänger-Themen 7
D Rekursion - Ich raffs nicht Java Basics - Anfänger-Themen 16
N Methoden Rekursion mit Kreisen Java Basics - Anfänger-Themen 7
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
J Rekursion Java Basics - Anfänger-Themen 22
T Rekursion Programmierverständnis Java Basics - Anfänger-Themen 12
K Rekursion: Rechenmauer mit Array erstellen Java Basics - Anfänger-Themen 17
K Rekursion einer Zahlenfolge (Ab- und Aufzählung) Java Basics - Anfänger-Themen 6
Zeppi Rekursion Java Basics - Anfänger-Themen 15
V Backtracking und Rekursion Java Basics - Anfänger-Themen 15
L REKURSION Java Basics - Anfänger-Themen 13
Kirby.exe Rekursion Java Basics - Anfänger-Themen 7
N for Schleife durch Rekursion ersetzen Java Basics - Anfänger-Themen 6
X Rekursion Java Basics - Anfänger-Themen 3
H Rekursion Java Basics - Anfänger-Themen 2
D Erste Schritte Rekursion Java Basics - Anfänger-Themen 13
M Rekursion Tage Ansteckung gesamte Bevölkerung Java Basics - Anfänger-Themen 15
M Java Rekursion Java Basics - Anfänger-Themen 9
G Java Rekursion Java Basics - Anfänger-Themen 5
J Rekursion Klausur Aufgabe Java Basics - Anfänger-Themen 2
N Rekursion Java Basics - Anfänger-Themen 18
M Verständnisproblem der Rekursion bei Arrays Java Basics - Anfänger-Themen 8
X Rekursion Rätsel Java Basics - Anfänger-Themen 4
N Klassen Rekursion mit Feldern von Objekten Java Basics - Anfänger-Themen 14
W Rekursion Java Basics - Anfänger-Themen 0
D Konsolenausgabe Zahlenfolge Rekursion Java Basics - Anfänger-Themen 3
J Ping Pong Methode mit Rekursion Java Basics - Anfänger-Themen 1
N Rekursion Java Basics - Anfänger-Themen 1
B Rekursion Basic Java Basics - Anfänger-Themen 15
O Rekursion Mergesort Java Basics - Anfänger-Themen 18
G Rekursion Java Basics - Anfänger-Themen 20
M Rekursion Java Basics - Anfänger-Themen 7
F Hilfe bei Rekursion... Java Basics - Anfänger-Themen 4
A Mit Rekursion Zufallszahlen erstellen und größte finden Java Basics - Anfänger-Themen 5
B Rekursion Wurzel Java Basics - Anfänger-Themen 39
O Rekursion ordentlich aufschreiben Java Basics - Anfänger-Themen 2
B Rekursion verstehen Java Basics - Anfänger-Themen 4
O Rekursion Java Basics - Anfänger-Themen 2
E Rekursion verstehen. Java Basics - Anfänger-Themen 4
E Rekursion Kisten befüllen Java Basics - Anfänger-Themen 10
E Rekursion verstehen Java Basics - Anfänger-Themen 2
O Rekursion, String Java Basics - Anfänger-Themen 8
N Invertierte Rekursion??? Java Basics - Anfänger-Themen 5
M Bitte um Hilfe bei Quellcode (Rekursion) Java Basics - Anfänger-Themen 6
T Rekursion Warum bricht meine Funktion nicht ab Java Basics - Anfänger-Themen 4
A Hilfe bei Rekursion,Ich verstehe nicht,wie funktioniert die Rekursion in der Methode "walk" Java Basics - Anfänger-Themen 13
L Rekursion im Baum Java Basics - Anfänger-Themen 9
E Pfade eines Baums angeben ohne Rekursion Java Basics - Anfänger-Themen 20
L Rekursion Baumknoten Java Basics - Anfänger-Themen 8
L Rekursion größtes Zeichen Java Basics - Anfänger-Themen 8
L Rekursion Modulo Java Basics - Anfänger-Themen 7
I Rekursion Java Basics - Anfänger-Themen 11
H Rekursion Java Basics - Anfänger-Themen 7
N Methoden zur Rekursion (catalansche Zahlen) Java Basics - Anfänger-Themen 4
S Frage zu Rekursion... Java Basics - Anfänger-Themen 15
N Java catalansche Zahlen (Rekursion) Java Basics - Anfänger-Themen 5
S Noch eine Frage zur Rekursion... Java Basics - Anfänger-Themen 11
S Frage zu einer Rekursion Java Basics - Anfänger-Themen 15
F Methoden Abbruchbedingung bei Rekursion Java Basics - Anfänger-Themen 2
Z Rekursion Primzahlen Java Basics - Anfänger-Themen 1
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
L Methoden Rekursion gibt alten Wert wieder Java Basics - Anfänger-Themen 37
M Rekursion Minimums Suche Java Basics - Anfänger-Themen 12
J Rekursion Java Basics - Anfänger-Themen 5
F Aufgabe Rekursion Binärer Baum Java Basics - Anfänger-Themen 15
N Rekursion Java Basics - Anfänger-Themen 2
B Rekursion - Übung Java Basics - Anfänger-Themen 2
B Problem beim grundsätzlichen Verständnis bei Rekursion mit 2-dimensionalen Array Java Basics - Anfänger-Themen 6
P Rekursion Java Basics - Anfänger-Themen 19
G Rekursion Beispiel Java Basics - Anfänger-Themen 3
M Rekursion schreiben Java Basics - Anfänger-Themen 16
A Rekursion Funktion in eine Iterativ Funktion umwandeln Java Basics - Anfänger-Themen 9
T Array Rekursion Java Basics - Anfänger-Themen 1
B lineare und schlichte Rekursion Java Basics - Anfänger-Themen 1
A Rekursion Java Basics - Anfänger-Themen 2
B Rekursion Java Basics - Anfänger-Themen 3
A Rekursion stoppt an der falschen Stelle Java Basics - Anfänger-Themen 4
A Lineare Rekursion Java Basics - Anfänger-Themen 6
P Hilfe zur Rekursion? Java Basics - Anfänger-Themen 2
B Rekursion Schneeflocke - Kurze Frage zur Methode Java Basics - Anfänger-Themen 11
L Rekursion Java Basics - Anfänger-Themen 4
S Rekursion Rückgabe - Türme von Hanoi Java Basics - Anfänger-Themen 16
kilopack15 Rekursion und Schleifen Java Basics - Anfänger-Themen 27
G rekursion nicht verstanden Java Basics - Anfänger-Themen 5
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
E Methoden String wird in Rekursion nicht überschrieben Java Basics - Anfänger-Themen 2
T 2fach Rekursion. Java Basics - Anfänger-Themen 4
N Rekursion mit if-Anweisung Java Basics - Anfänger-Themen 10
K Methoden Zahlensysteme umwandeln mittels Rekursion Java Basics - Anfänger-Themen 5
H Rekursion Binäre Suche Java Basics - Anfänger-Themen 2
P Methoden Primzahltest mit Rekursion Java Basics - Anfänger-Themen 3
C Rekursion überführen in eine normale methode Java Basics - Anfänger-Themen 1
M Methoden Rekursion nachvollziehen Java Basics - Anfänger-Themen 4
C Rekursion Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben