Methoden Rekursion nachvollziehen

MWin123

Bekanntes Mitglied
Hallo, ich bin Java Anfänger und versuche die rekursive Programmierung zu erlernen.

Mir ist leider nicht ganz klar, wie Rekursion mit verschiedenen Variablen funktioniert.

Folgendes Beispiel:
Java:
public class Aufgabe3 {

    private static int simple(int line) {
        System.out.println("" /* TODO: Ausdruck anpassen */);
        return (-1 /* TODO: Ausdruck anpassen */);
    }


    private static int rec(int i, int line) {
        System.out.println("" /* TODO: Ausdruck anpassen */);
        if (i > 0) {
            int a /* TODO: Variable anpassen */ = rec(i - 1, (-1 /* TODO: Ausdruck anpassen */));
            int b /* TODO: Variable anpassen */ = simple(-1 /* TODO: Ausdruck anpassen */);
            int c /* TODO: Variable anpassen */ = rec(i - 1, (-1 /* TODO: Ausdruck anpassen */));
            return (-1 /* TODO: Ausdruck anpassen */);
        }
        return (-1 /* TODO: Ausdruck anpassen */);
    }
}
Anhand der Aufgabe sollen die Methodenaufrufe nachvollzogen und ein Protokoll ausgegeben werden.
Daher sollte für rec(4,0) folgendes ausgeben werden:
1 rec(4, 0)
2 rec(3, 1)
3 rec(2, 2)
4 rec(1, 3)
5 rec(0, 4)
6 simple(5)
7 rec(0, 6)
8 simple(7)
9 rec(1, 8)
10 rec(0, 9)

Nur wie gehe ich hier jetzt vor?

Einfache rekursive Methoden beherrsche ich, nur wie funktioniert das ganze mit Variablen, die als rekursive Methode definiert sind? Ich kann ja nur einen Int Wert zurückgeben.
Wenn ich mit int a die ersten 5 Zeilen ausgeben will und nur einen Wert zurückgeben kann, würde ich die fortlaufende Nummer nehmen. Nur wie komme ich jetzt in die Methode simple rein?

Komplizierter wird es noch dadurch, dass ich nur die mit TODO gekennzeichneten Bereiche anpassen darf.
 

Flown

Administrator
Mitarbeiter
Was redest du da mit Variablen und Funktionen. a, b, c sind ganz einfache ints.

Sieh dir das Protokoll doch näher an.

Jetzt musst du nur die Aufrufparameter und die Rückgabeparameter so hintrimmen, dass sie dem Protokoll entsprechen.

Fürs erste kann ich dir sagen, dass du mal die System.out.println machst und dir genau mal die i und lines ausgibst, genau so wie in dem Protokoll. Dann spielst du mit den Werten herum und et voilà.
 

MWin123

Bekanntes Mitglied
Ich wollte es nur allgemein halten und habe daher Variablen statt int gesagt.
Wären es floats oder Strings würde ich mich genau so wenig auskennen.

Mit viel rumprobieren stimmen nun die ersten 7 Zeilen:
1 rec(4, 0)
2 rec(3, 1)
3 rec(2, 2)
4 rec(1, 3)
5 rec(0, 4)
6 simple(5)
7 rec(0, 6)

5 simple(4)
6 rec(1, 5)
7 rec(0, 6)
8 simple(7)
9 rec(0, 8)
4 simple(3)
5 rec(2, 4)
6 rec(1, 5)
7 rec(0, 6)
8 simple(7)
9 rec(0, 8)
7 simple(6)
8 rec(1, 7)
9 rec(0, 8)
10 simple(9)
11 rec(0, 10)
3 simple(2)
4 rec(3, 3)
5 rec(2, 4)
6 rec(1, 5)
7 rec(0, 6)
8 simple(7)
9 rec(0, 8)
7 simple(6)
8 rec(1, 7)
9 rec(0, 8)
10 simple(9)
11 rec(0, 10)
6 simple(5)
7 rec(2, 6)
8 rec(1, 7)
9 rec(0, 8)
10 simple(9)
11 rec(0, 10)
9 simple(8)
10 rec(1, 9)
11 rec(0, 10)
12 simple(11)
13 rec(0, 12)

Der Code schaut zur Zeit so aus:
Java:
/*    Aufgabe3) Rekursion nachvollziehen


    Die Methoden 'simple' und 'rec' sind nach folgendem Muster aufgebaut:


    private static int simple(int line) {
        System.out.println(...);
        return ...;
    }


    private static int rec(int i, int line) {
         System.out.println(...);
         if (i > 0) {
            ... = rec(i - 1, ...);
            ... = simple(...);
            ... = rec(i - 1, ...);
            return ...;
        }
        return ...;
    }


    Ersetzen Sie alle '...' in diesem Muster durch Ausdrücke, sodass ein Aufruf von rec(4, 0) ein Protokoll aller
    Methodenaufrufe erstellt. Jeder Eintrag im Protokoll gibt eine fortlaufende Nummer des Aufrufs, den Namen der
    aufgerufenen Methode und die Werte aller Parameter an. Die Parameter 'line' in 'simple' und 'rec' sowie die
    zurückgegebenen Ergebnisse stehen dabei jeweils für die fortlaufende Nummer der zuletzt ausgegebenen Zeile im
    Protokoll. Die ersten zehn Zeilen des Protokolls sollen folgendermaßen aussehen:


    1 rec(4, 0)
    2 rec(3, 1)
    3 rec(2, 2)
    4 rec(1, 3)
    5 rec(0, 4)
    6 simple(5)
    7 rec(0, 6)
    8 simple(7)
    9 rec(1, 8)
    10 rec(0, 9)




    Zusatzfragen:
    1. Wodurch kommt die große Anzahl der Zeilen im Protokoll zustande?
    2. Wie stark wirkt sich eine Änderung des ersten Arguments von 'rec' auf die Anzahl der Zeilen im Protokoll aus?
       Wie viele Zeilen würde man z.B. mit 2, 6, 10 oder 15 statt 4 bekommen?
    5. Wie viele Aufrufe von 'rec' sind maximal zur selben Zeit aktiv?
    4. Durch welche einzelne Anweisung könnte man die vier Anweisungen in der bedingten Anweisung in 'rec' ersetzen,
       ohne die Semantik des Programms zu ändern?
*/
public class Aufgabe3 {


    private static int simple(int line) {
        System.out.println(line + 1 + " simple(" + line + ")" /* TODO: Ausdruck anpassen */);
        return (line + 1 /* TODO: Ausdruck anpassen */);
    }


    private static int rec(int i, int line) {
        System.out.println(line + 1 + " rec(" + i + ", " + line + ")"/* TODO: Ausdruck anpassen */);
        if (i > 0) {
            int a /* TODO: Variable anpassen */ = rec(i - 1, (line + 1 /* TODO: Ausdruck anpassen */));
            int b /* TODO: Variable anpassen */ = simple(line + 2 /* TODO: Ausdruck anpassen */);
            int c /* TODO: Variable anpassen */ = rec(i - 1, (b /* TODO: Ausdruck anpassen */));
            return (-1 /* TODO: Ausdruck anpassen */);
        }
        return (-1 /* TODO: Ausdruck anpassen */);
    }


    // just for testing ...
    public static void main(String[] args) {
        // Die Implementierung von main kann ohne Auswirkung auf die Korrektheit der Lösung geändert werden.
        rec(4, 0);
    }
}
Was mir noch unklar ist:

1. Warum wird simple wiederholt ausgeführt? rec() wird ja solange wiederholt, bis i=0

2. Ich habe hier simple das Argument (line + 2) gegeben. Damit bekommt zumindest der erste Aufruf von simple den richtigen Wert. Wieso ist mir aber nicht klar.
Java:
int b /* TODO: Variable anpassen */ = simple(line + 2 /* TODO: Ausdruck anpassen */);
3. Was soll ich denn bei rec() und simple() zurückgeben lassen?
4. Was mache ich mit int c?
 

Flown

Administrator
Mitarbeiter
Schau dir bitte nochmal Rekursionen an. Nimm Stift + Papier in die Hand und zeichne deinen Algorithmus mit der Hand auf (Z.b. für i = 2 & line = 0 => da sollten 10 Zeilen rauskommen bei den - bei rec(4, 0) sind es übrigens 45). Beziehungsweise starte den Debugger und schau dir mal an, was du da aufrufst und wie oft!

Ich kann dir jetzt nicht mehr sagen, ohne dir gleich die Lösung zu verraten.
 

MWin123

Bekanntes Mitglied
So, heute das erste Mal den Debugger benutzt. Damit lassen sich die Aufrufe doch ein Stück leichter nachvollziehen.

Wirklich verstanden habe ich es jedoch noch nicht, aber immerhin passt jetzt die Ausgabe!

1 rec(4, 0)
2 rec(3, 1)
3 rec(2, 2)
4 rec(1, 3)
5 rec(0, 4)
6 simple(5)
7 rec(0, 6)
8 simple(7)
9 rec(1, 8)
10 rec(0, 9)
11 simple(10)
12 rec(0, 11)
13 simple(12)
14 rec(2, 13)
15 rec(1, 14)
16 rec(0, 15)
17 simple(16)
18 rec(0, 17)
19 simple(18)
20 rec(1, 19)
21 rec(0, 20)
22 simple(21)
23 rec(0, 22)
24 simple(23)
25 rec(3, 24)
26 rec(2, 25)
27 rec(1, 26)
28 rec(0, 27)
29 simple(28)
30 rec(0, 29)
31 simple(30)
32 rec(1, 31)
33 rec(0, 32)
34 simple(33)
35 rec(0, 34)
36 simple(35)
37 rec(2, 36)
38 rec(1, 37)
39 rec(0, 38)
40 simple(39)
41 rec(0, 40)
42 simple(41)
43 rec(1, 42)
44 rec(0, 43)
45 simple(44)
46 rec(0, 45)

Java:
/*    Aufgabe3) Rekursion nachvollziehen

    Die Methoden 'simple' und 'rec' sind nach folgendem Muster aufgebaut:


    private static int simple(int line) {
        System.out.println(...);
        return ...;
    }


    private static int rec(int i, int line) {
         System.out.println(...);
         if (i > 0) {
            ... = rec(i - 1, ...);
            ... = simple(...);
            ... = rec(i - 1, ...);
            return ...;
        }
        return ...;
    }


    Ersetzen Sie alle '...' in diesem Muster durch Ausdrücke, sodass ein Aufruf von rec(4, 0) ein Protokoll aller
    Methodenaufrufe erstellt. Jeder Eintrag im Protokoll gibt eine fortlaufende Nummer des Aufrufs, den Namen der
    aufgerufenen Methode und die Werte aller Parameter an. Die Parameter 'line' in 'simple' und 'rec' sowie die
    zurückgegebenen Ergebnisse stehen dabei jeweils für die fortlaufende Nummer der zuletzt ausgegebenen Zeile im
    Protokoll. Die ersten zehn Zeilen des Protokolls sollen folgendermaßen aussehen:


    1 rec(4, 0)
    2 rec(3, 1)
    3 rec(2, 2)
    4 rec(1, 3)
    5 rec(0, 4)
    6 simple(5)
    7 rec(0, 6)
    8 simple(7)
    9 rec(1, 8)
    10 rec(0, 9)




    Zusatzfragen:
    1. Wodurch kommt die große Anzahl der Zeilen im Protokoll zustande?
    2. Wie stark wirkt sich eine Änderung des ersten Arguments von 'rec' auf die Anzahl der Zeilen im Protokoll aus?
       Wie viele Zeilen würde man z.B. mit 2, 6, 10 oder 15 statt 4 bekommen?
    5. Wie viele Aufrufe von 'rec' sind maximal zur selben Zeit aktiv?
    4. Durch welche einzelne Anweisung könnte man die vier Anweisungen in der bedingten Anweisung in 'rec' ersetzen,
       ohne die Semantik des Programms zu ändern?
*/
public class Aufgabe3 {


    private static int simple(int line) {
        System.out.println(line + 1 + " simple(" + line + ")" /* TODO: Ausdruck anpassen */);
        return (line + 1/* TODO: Ausdruck anpassen */);
    }


    private static int rec(int i, int line) {
        System.out.println(line + 1 + " rec(" + i + ", " + line + ")"/* TODO: Ausdruck anpassen */);
        if (i > 0) {
            int a /* TODO: Variable anpassen */ = rec(i - 1, (line +1 /* TODO: Ausdruck anpassen */));
            int b /* TODO: Variable anpassen */ = simple(a /* TODO: Ausdruck anpassen */);
            int c /* TODO: Variable anpassen */ = rec(i - 1, (b /* TODO: Ausdruck anpassen */));
            return (c /* TODO: Ausdruck anpassen */);
        }
        return (line + 1 /* TODO: Ausdruck anpassen */);
    }


    // just for testing ...
    public static void main(String[] args) {
        // Die Implementierung von main kann ohne Auswirkung auf die Korrektheit der Lösung geändert werden.
        rec(4, 0);
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Rekursion (anhand von Mergesort) nachvollziehen Java Basics - Anfänger-Themen 4
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
E Rekursion Java Basics - Anfänger-Themen 10
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

Ähnliche Java Themen

Neue Themen


Oben