Rekursive Methode in Interative Methode umwandeln

C.B.

Aktives Mitglied
Hallo,

ich möchte diese rekursive Methode in eine Interaktive Methode umwandeln. Durch das zweimalige rekursive aufrufen der a Methode bei x % 2 == 0, weiß ich nicht wie ich vorgehen soll. Habt ihr tipps dazu?

Vielen Dank.


Java:
    public static int a(int x, int y) {
        if (x <= 0 || y < 0) {
            return x - y + 2;
        }
        if (x % 2 == 0) {
            return a(x / 2, y) + a(x, y - 1);
        }
        return a(x - 1, y - 2);
    }
 

Neumi5694

Top Contributor
Du meinst "iterativ". Interaktiv würde ja heißen, dass du während der Laufzeit eingreifen willst.
Davon abgesehen ....

Die erste Bedingung ist offensichtlich dein Rückgabewert ohne Rekursion, die wäre dann also die Abbruchbedingung für egal welche Schleife du verwenden willst.
Der letzte Teil ist das, was bei ungeraden X-Werten innerhalb der Schleife gemacht wird: x und y werden jeweils einfach verändert.
Woran ich im Denken gerade scheitere, ist, wie man den mittleren Teil mit der Addition der beiden rekursiven Aufrufe handhaben könnte.
Das ist eigentlich ein klassisches Beispiel dafür, wo ich auf jeden Fall rekursiv arbeiten würde.

Was soll die Funktion eigentlich berechnen? Die Aufgabe der Funktion iterativ zu lösen wäre sinnvoller als den Code umzuschreiben ohne zu wissen, was rauskommen soll.
Java:
    while (x > 0 && y > 0) {
        if (x % 2 == 0) {
            //TODO
        } else {
            x-=1;
            y-"2;
        }
    }
    return x - y + 2;
 

mihe7

Top Contributor
Woran ich im Denken gerade scheitere, ist, wie man den mittleren Teil mit der Addition der beiden rekursiven Aufrufe handhaben könnte.
Über eine State Machine (besteht hier einfach aus einem boolean): Schritt 1 (false) linke Seite, Schritt 2 (true) rechte Seite und Addition mit der linken Seite. Sollte funktionieren.

Die Aufgabe der Funktion iterativ zu lösen wäre sinnvoller als den Code umzuschreiben ohne zu wissen, was rauskommen soll.
Das ist definitiv der bessere Weg.
 

C.B.

Aktives Mitglied
Du meinst "iterativ". Interaktiv würde ja heißen, dass du während der Laufzeit eingreifen willst.
Davon abgesehen ....

Die erste Bedingung ist offensichtlich dein Rückgabewert ohne Rekursion, die wäre dann also die Abbruchbedingung für egal welche Schleife du verwenden willst.
Der letzte Teil ist das, was bei ungeraden X-Werten innerhalb der Schleife gemacht wird: x und y werden jeweils einfach verändert.
Woran ich im Denken gerade scheitere, ist, wie man den mittleren Teil mit der Addition der beiden rekursiven Aufrufe handhaben könnte.
Das ist eigentlich ein klassisches Beispiel dafür, wo ich auf jeden Fall rekursiv arbeiten würde.

Was soll die Funktion eigentlich berechnen? Die Aufgabe der Funktion iterativ zu lösen wäre sinnvoller als den Code umzuschreiben ohne zu wissen, was rauskommen soll.
Java:
    while (x > 0 && y > 0) {
        if (x % 2 == 0) {
            //TODO
        } else {
            x-=1;
            y-"2;
        }
    }
    return x - y + 2;
Bei mir scheitert es auch am mittleren Teil. Das Umschreiben von rekursiv zu iterativ ist nur zur Übung als Prüfungsvorbereitung.
 

C.B.

Aktives Mitglied
Über eine State Machine (besteht hier einfach aus einem boolean): Schritt 1 (false) linke Seite, Schritt 2 (true) rechte Seite und Addition mit der linken Seite. Sollte funktionieren.


Das ist definitiv der bessere Weg.
Weiß nicht genau was du meinst, könnest du es noch detaillierter erklären? Vielen Dank.
 

mihe7

Top Contributor
Das war zu kompliziert von mir gedacht. Hier dürfte ein Stack reichen.

Nehmen wir mal:
Java:
public int f(int x) {
    if (x <= 0) { return 0; }
    return x + f(x-1) + f(x/2);
}

Das lässt sich schreiben als:
Java:
public int f(int x) {
    if (x <= 0) { return 0; }
    int sum = x;
    sum += f(x-1); // erster rekursiver Aufruf
    sum += f(x/2); // zweiter rekursiver Aufruf
    return sum;
}

Da die Reihenolge der Summanden keine Rolle spielt, kann man hier einfach die Werte auf den Stack legen:
Java:
public int f(int x) {
    int sum = 0;
    Stack<Integer> stack = new Stack<>();
    stack.push(x);
    while (!stack.isEmpty()) {
        int cx = stack.pop();
        sum += cx;
        if (cx > 1) {              
             stack.push(cx/2);
        }
        if (cx > 0) {
             stack.push(cx-1);
        }
    }
    return sum;
}
Ansonsten müsste man cx-1 oben und cx/2 unten in den Stack einfügen, dann sollte auch die Reihenfolge passen.
 

EinNickname9

Bekanntes Mitglied
Also, bevor man die mathematischen Optimierungen macht, kann man es auch einfach straightforward so machen:

Java:
import java.util.Stack;

public class RecursiveToIterative {
    public static int a(int x, int y) {
        if (x <= 0 || y < 0) {
            return x - y + 2;
        }
        if (x % 2 == 0) {
            return a(x / 2, y) + a(x, y - 1);
        }
        return a(x - 1, y - 2);
    }

    public static int b(int x, int y) {
        int result = 0;
        Stack<int[]> stack = new Stack<>();
        stack.push(new int[]{x, y, 0});
        while (!stack.empty()) {
            int[] pop = stack.pop();
            int a = pop[0], b = pop[1];
            if (a <= 0 || b < 0) {
                result = pop[2] + a - b + 2;
            } else if (a % 2 == 0) {
                stack.push(new int[]{a / 2, b, result});
                stack.push(new int[]{a, b - 1, result});
            } else {
                stack.push(new int[]{a - 1, b - 2, result});
            }
        }
        return result;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                System.out.println(i + " " + j);
                System.out.println(a(i, j));
                System.out.println(b(i, j));
            }
        }
    }
}

BTW, das Ding heißt "iterativ"!!!
 

C.B.

Aktives Mitglied
Vielen Dank. Ist das auch mit Feldern umsetzbar? Bin in einem Anfängerkurs und da haben wir Stack nicht behandelt.
 

C.B.

Aktives Mitglied
klaro, du musst die Arraygröße nur groß genug wählen und dir dann noch einen Index merken... :)
D.h. die Methode a und Methode b sind Hilfsmethoden für x und y, da x halbiert wird und y-1 gerechnet wird. Die Ergebnisse der Methoden a und b speichert man in zwei Felder und dann greift man in der Methode f auf die Ergebnisse der Felder zu?
 

EinNickname9

Bekanntes Mitglied
D.h. die Methode a und Methode b sind Hilfsmethoden für x und y, da x halbiert wird und y-1 gerechnet wird.
Die genaue Bedeutung dieser Funktionen zu erklären, das ist Sache der Mathematiker. Wir Informatiker sind nur Programmiersklaven oder Erfüllungsgehilfen... also die ganz einfachen Leute, das Fußvolk...

Die Ergebnisse der Methoden a und b speichert man in zwei Felder und dann greift man in der Methode f auf die Ergebnisse der Felder zu?
Nee, Es geht dir doch darum, den "Stack" zu vermeiden, bzw., diesen durch ein Array (int[][]) zu ersetzen. Dafür erstellst du zunächst ein neues Array, sagen wir:
int[][] stack = new int[100][3];
dann brauchst du eine Indexvariable:
int index = 0;
Bei jedem push erhöht sich index um 1. Bei jedem pop verringert es sich um 1. Wenn index <= 0 gilt, dann kann die while-Schleife verlassen werden...

Sage mal, in welchem Anfängerkurs bist du denn? Weil das ist schon etwas fortgeschrittenere Programmierung...
 

C.B.

Aktives Mitglied
Die genaue Bedeutung dieser Funktionen zu erklären, das ist Sache der Mathematiker. Wir Informatiker sind nur Programmiersklaven oder Erfüllungsgehilfen... also die ganz einfachen Leute, das Fußvolk...


Nee, Es geht dir doch darum, den "Stack" zu vermeiden, bzw., diesen durch ein Array (int[][]) zu ersetzen. Dafür erstellst du zunächst ein neues Array, sagen wir:
int[][] stack = new int[100][3];
dann brauchst du eine Indexvariable:
int index = 0;
Bei jedem push erhöht sich index um 1. Bei jedem pop verringert es sich um 1. Wenn index <= 0 gilt, dann kann die while-Schleife verlassen werden...

Sage mal, in welchem Anfängerkurs bist du denn? Weil das ist schon etwas fortgeschrittenere Programmierung...
Vielen Dank für die Erklärungen. Ich denke wahrscheinlich muss ich das dann nicht können. Es gab immer Aufgaben, wo man eine iterative Methode in eine eine rekursive Lösung und umgekehrt umschreiben musste. Aber da gab es nicht zwei addierte rekursive Aufrufe. Wahrscheinlich muss ich das gar nicht können aber wollte es eben probieren :)
 

Barista

Top Contributor
Es gab immer Aufgaben, wo man eine iterative Methode in eine eine rekursive Lösung und umgekehrt umschreiben musste. Aber da gab es nicht zwei addierte rekursive Aufrufe. Wahrscheinlich muss ich das gar nicht können aber wollte es eben probieren
IMHE kann man nur tail call recursion Aufrufe in eine Iteration umwandeln.


Die Verwendung eines expliziten Stack ist IMHE keine wirkliche iterative Lösung.

Mit der Addition wird es deshalb nicht klappen, ist eben die letzte Operation, nicht der rekursive Aufruf.
 

Barista

Top Contributor
Warum es keine iterative Lösung sein, nur weil einer Datenstruktur verwendet wird?
Du meinst sicher:
Warum soll es keine iterative Lösung sein, nur weil der Stack in einer Datenstruktur verwendet wird?

Dies ist meine subjektive Ansicht.

Ich empfinde in diesem Fall, dass die Umwandlung vom impliziten zum expliziten Stack den rekursiven Charakter der Lösung nicht ändert.
 

mihe7

Top Contributor
Du meinst sicher:
Sorry, das "r" war zu viel, es sollte heißen, "nur weil eine Datenstruktur verwendet wird". Hier ist die DS ein Stack :)

Ich empfinde in diesem Fall, dass die Umwandlung vom impliziten zum expliziten Stack den rekursiven Charakter der Lösung nicht ändert.
Ja, in diesem Fall ist das sicher richtig. In anderen Fällen wirkt das nicht so künstlich, z. B. bei der Tiefensuche in einem Baum. Da führt an einem Stack o.ä. praktisch kein Weg vorbei. Das dürfte problemabhängig sein.
 

EinNickname9

Bekanntes Mitglied
Die Verwendung eines expliziten Stack ist IMHE keine wirkliche iterative Lösung.
Ehm, lies einfach nochmal nach, was "rekursiv" und "iterativ" bedeutet - denn diese Ansicht ist falsch. Jede rekursive Form kann mittels Stack in eine iterative gebracht werden.

Das Umformen mathematischer Terme sehe ich hingegen als ungültige iterative Konvertierung an. Bei zum Beispiel den Türmen von Hanoi funktioniert das, ist aber reine mathematische Spielerrei.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Rekursive Methode Java Basics - Anfänger-Themen 13
til237 Iterative Methode in rekursive Methode umschreiben Java Basics - Anfänger-Themen 4
Csircc Rekursive Methode Stack Overflow Java Basics - Anfänger-Themen 10
G Rekursive Methode mit 2 Aufrufen Java Basics - Anfänger-Themen 1
M Rekursive Java-Methode Java Basics - Anfänger-Themen 13
G Rekursive Methode liefert augenscheinlich keinen boolean-Wert zurück. Java Basics - Anfänger-Themen 4
macle Rekursive String Methode, Gerade Zahlen rausfiltern Java Basics - Anfänger-Themen 10
J Rekursive swapArray Methode Java Basics - Anfänger-Themen 69
D Rekursive Methode Java Basics - Anfänger-Themen 8
O Quersumme rekursive Methode Java Basics - Anfänger-Themen 3
M Rekursive Methode Programmieren Java Basics - Anfänger-Themen 3
J rekursive Methode Java Basics - Anfänger-Themen 26
J Rekursive Methode - Ziffern einer Zahl ausgeben Java Basics - Anfänger-Themen 2
S Rekursive Methode Java Basics - Anfänger-Themen 8
O Rekursive Methode Java Basics - Anfänger-Themen 4
V Methoden Rekursive Methode mit String als Rückgabe Java Basics - Anfänger-Themen 7
K Rekursive Methode Java Basics - Anfänger-Themen 1
K Rekursive Methode für Fakultät mit BigInteger Java Basics - Anfänger-Themen 10
L Rekursive Methode a * b berechnen Java Basics - Anfänger-Themen 2
L Rekursive Methode zur Berechnung der Potenz q hoch p Java Basics - Anfänger-Themen 17
J Methoden Rekursive Return Methode Java Basics - Anfänger-Themen 2
P Methoden Rekursive Methode für Potenzen Java Basics - Anfänger-Themen 2
S Int zu Hexadezimal - Rekursive Methode Java Basics - Anfänger-Themen 2
C rekursive methode Java Basics - Anfänger-Themen 2
R rekursive Methode funktioniert nicht Java Basics - Anfänger-Themen 4
R Rekursive Methode, Files finden Java Basics - Anfänger-Themen 2
C rekursive Methode verstehe nicht! Java Basics - Anfänger-Themen 3
S Methoden rekursive Methode funktioniert nicht Java Basics - Anfänger-Themen 4
E Rekursive Methode Java Basics - Anfänger-Themen 3
A Rekursive Methode in Iterative umwandeln Java Basics - Anfänger-Themen 6
C Rekursive Methode - Ziffern in Zahl Java Basics - Anfänger-Themen 33
G Rekursive Methode Java Basics - Anfänger-Themen 3
E Rekursive Methode mit Zufallsarray Java Basics - Anfänger-Themen 6
E Rekursive Methode Java Basics - Anfänger-Themen 18
M Rekursive Methode - wo ist der Fehler? Java Basics - Anfänger-Themen 4
J rekursive methode Java Basics - Anfänger-Themen 6
H ScrollBar inaktiv / Rekursive Methode Java Basics - Anfänger-Themen 4
J Rekursive Methode Java Basics - Anfänger-Themen 11
G Rekursive Methode Java Basics - Anfänger-Themen 5
J Rekursive Methode: Fakultaet berechnen Java Basics - Anfänger-Themen 5
G rekursive Methode Java Basics - Anfänger-Themen 3
G rekursive u iterative Methode Java Basics - Anfänger-Themen 8
G Rekursive Methode Java Basics - Anfänger-Themen 7
emreiu Methoden Rekursive Methoden Runter- & Hochzählen Java Basics - Anfänger-Themen 2
Viktor A. Kaiser Rekursive Algorithmen Java Basics - Anfänger-Themen 9
new_to_coding Rekursive Reihe implementieren Java Basics - Anfänger-Themen 1
J Rekursive Funktion und return statement Java Basics - Anfänger-Themen 3
S Rekursive Kombinationen Java Basics - Anfänger-Themen 6
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
schredder Rekursive Quadratzahlen - Ergebnisprozedur Java Basics - Anfänger-Themen 1
A Rekursive Implementation eines Codes Java Basics - Anfänger-Themen 4
L Rekursive Methoden Java Basics - Anfänger-Themen 14
J Rekursive Folge (a=a-1) Java Basics - Anfänger-Themen 9
veryck Methoden Rekursive Methoden mit Rückgabeparameter Java Basics - Anfänger-Themen 9
M Rekursive Prüfung ob ein Array sortiert ist... Java Basics - Anfänger-Themen 4
R Methoden rekursive Methoden Java Basics - Anfänger-Themen 6
B Treetable (rekursive Funktion) aufbauen von Datenbank Java Basics - Anfänger-Themen 4
M rekursive division/0 mit exception Java Basics - Anfänger-Themen 18
MiMa Rekursive Dateiliste erstellen mit Dateiendung(en) ?? Java Basics - Anfänger-Themen 4
G Harmonische Rekursive Folge Java Basics - Anfänger-Themen 3
T Stack Overflow - Rekursive Fibonacci Java Basics - Anfänger-Themen 10
B Datentypen Suchbaum - Rekursive Ausgabe Java Basics - Anfänger-Themen 1
M Methoden Binäre Suche als rekursive Variante Java Basics - Anfänger-Themen 5
B Rekursive Algorithmus schreiben Java Basics - Anfänger-Themen 8
S Eine rekursive Lösung Java Basics - Anfänger-Themen 4
M Rekursive Suche in einem Feld Java Basics - Anfänger-Themen 11
N Rekursive Addition mit Scanner Java Basics - Anfänger-Themen 12
shiroX OOP Rekursive und Iterative Definition Java Basics - Anfänger-Themen 2
B Methoden Rekursive Methoden Java Basics - Anfänger-Themen 2
T Iterative Pi Berechnung in Rekursive Java Basics - Anfänger-Themen 2
D Methoden Rekursive Methoden Java Basics - Anfänger-Themen 13
M Stürzen alle Rekursive Methoden irgendwann ab? Java Basics - Anfänger-Themen 11
D Primzahlen und Rekursive Liste Java Basics - Anfänger-Themen 29
S rekursive folge verbessern Java Basics - Anfänger-Themen 2
N Methoden Rekursive Fibonaccizahlen mit Array Java Basics - Anfänger-Themen 2
R Rekursive Ausgabe eines Binärbaums Java Basics - Anfänger-Themen 4
J Methoden Rekursive Potenz ohne Math.Pow() Java Basics - Anfänger-Themen 9
S Labyrith Rekursive Wegsuche Java Basics - Anfänger-Themen 4
U Dezimal zu Hexadezimal rekursive Funktion Java Basics - Anfänger-Themen 8
M rekursive Funktion zur Berechnung der Spiegelzahl Java Basics - Anfänger-Themen 7
L iterative und rekursive Folge Java Basics - Anfänger-Themen 20
A rekursive Listen in Java? Java Basics - Anfänger-Themen 5
B OOP Einfach verkettete Liste - rekursive Methoden Java Basics - Anfänger-Themen 1
U Rekursive lösung von pascal dreieck Java Basics - Anfänger-Themen 11
N Rekursive Berechnung der Höhe eines binären Baumes Java Basics - Anfänger-Themen 4
K Rekursive Methoden Java Basics - Anfänger-Themen 15
K Rekursive Funktion (Verständnissfrage) Java Basics - Anfänger-Themen 5
S Rekursive Bruch potenzierung Java Basics - Anfänger-Themen 2
D rekursive Summenberechnung Java Basics - Anfänger-Themen 8
E Rekursive definierten Folge Java Basics - Anfänger-Themen 10
A HILFE! Rekursive Funktion Java Basics - Anfänger-Themen 20
kulturfenster rekursive Binaere Suche Java Basics - Anfänger-Themen 12
F Rekursive Aufrufe, Parameterübergabe, call by reference Java Basics - Anfänger-Themen 3
G Rekursive Berechnung von n über k schlägt fehl Java Basics - Anfänger-Themen 5
B Rekursive & schreiben im ArrayList Java Basics - Anfänger-Themen 2
J Rekursive Fkt. Java Basics - Anfänger-Themen 2
A Rekursive Dateisuche Java Basics - Anfänger-Themen 12
K rekursive Funktion mit mehreren Parametern Java Basics - Anfänger-Themen 5
N rekursive Beispiele Java Basics - Anfänger-Themen 3
ven000m Rekursive Funktionen - Frage Java Basics - Anfänger-Themen 16

Ähnliche Java Themen

Neue Themen


Oben