Rekursive Methode

Ru$h

Aktives Mitglied
Hallo,

folgende Methode ist eine Scheinrekursion, da man hier auch eine for-´Schleife verwenden kann.

Java:
 public ArrayList zuordnen (ArrayList reiter){
            if (reiter.isEmpty()){
                return reiter;
            }
            Reiter DerReiter = waehlerischsterReiter(reiter);
            if (passendesPferd(DerReiter)){
                DerReiter.setpassendesPferd(zuordnungPferd(DerReiter));           
            }
            reiter.remove(DerReiter);
            DerReiter.removeWuensche();
            return zuordnen(reiter);   
        }

Wie kann ich eine richtige Rekursion daraus machen?
 

Ru$h

Aktives Mitglied
Weil die "Rekursion" nur in eine Richting funktioniert. Das heist wenn reiter.isEmpty, dann soll die Liste von unten nach oben aufgebaut werden und nicht nur wie in diesem Fall von oben nach unten.
Also so, dass man keine for-Schleife verwenden kann.
 

mrBrown

Super-Moderator
Mitarbeiter
Weil die "Rekursion" nur in eine Richting funktioniert. Das heist wenn reiter.isEmpty, dann soll die Liste von unten nach oben aufgebaut werden und nicht nur wie in diesem Fall von oben nach unten.
Also so, dass man keine for-Schleife verwenden kann.
Häh? Ich habe keine Ahnung, was du damit sagen willst...
 

Blender3D

Top Contributor
Wie kann ich eine richtige Rekursion daraus machen?
Ein iterative Lösung ist hier immer zu bevorzugen.
Rekursion:
Vorteil: schwierige Probleme lassen sich dadurch oft leichter formulieren.
Nachteil: Mit der Rekursionstiefe steigt der Speicherbedarf.
Obiges Problem ist als Schleife leicht zu formulieren. --> keine Rekursion benutzen. Es wird durch sie Scheinrekursion zwar kein Mehrspeicher benötigt, da der rekursive Aufruf am Ende der Funktion erfolgt. Und daher der Stack nicht mit dem Speicherzustand des augenblicklichen Funktion Aufrufes speichern muss.
Warum willst da etwas rekursiv machen ?
Schreib es lieber als Schleife hin.
 

Ru$h

Aktives Mitglied
Die Aufgabenstellung fordert eine Rekursion.
Vergleicht man meine Methode mit zum Beispiel der Fakultätsberechnung, so ist meine Methode umgeschrieben auf die Rekursion folgende:
Java:
private int value = 1;
public int fak(int n) {
            if(n==1) return 1;
            else {
                this.value *= n;
                return fak(n-1);
            }

Da ich hier aber auch eine for-Schleife verwenden kann, ist es eine Scheinrekursion und keine "richtige" Rekursion.
Zurück zu meiner eigentlichen Methode möchte ich wissen, wie ich aus dieser Methode eine richtige rekursive Methode machen kann. Denn wenn reiter.isEmpty, so wird eine leere Liste zurückgeben, das soll aber doch nicht sein, denn die Liste soll ja gefüllt werden, deshalb meine Frage, wie ich meine Methode rekursiv machen kann.
 

httpdigest

Top Contributor
Man kann dir hier nur schwer helfen. Erstmal, weil du ein Wort verwendest, das es so in der Geschichte der Informatik noch niemals gab: Scheinrekursion.
Google Suchergebnisse: 1 (außer dieser Thread hier).
Das heißt, du musst erstmal definieren, was für dich denn eine sogenannte "Scheinrekursion" genau ist.
Desweiteren verwendest du sehr viele Methoden, die du nicht weiter definiert hast:
- waehlerischsterReiter
- passendesPferd
- Reiter.setpassendesPferd
- zuordnungPferd
- Reiter.removeWuensche
so dass es schwierig wird, hier überhaupt durchzusteigen, was was macht.
Nehme dein Problem doch mal komplett auseinander und definiere für Randfälle, wie du möchtest, dass deine Rekursion genau aussieht. Was passiert, wenn es keinen Reiter gibt? Das ist doch vermutlich immer noch deine Rekursionsabbruchbedingung, also genau wie jetzt auch...
Dann definiere, was passieren sollte, wenn es einen Reiter gibt, aber keine Pferde (oder so).
Spiele einfach mal ganz viele Fälle durch. Dann solltest du vielleicht zu einer Lösung kommen.
 

Blender3D

Top Contributor
wie ich aus dieser Methode eine richtige rekursive Methode machen kann
Also am Beispiel Fakultät.
Deine rekursive Lösung würde ich so nicht machen weil das Attribut value vollkommen überflüssig ist.
private int value = 1;
public int fak(int n) {
if(n==1) return 1;
else {
this.value *= n;
return fak(n-1);
}

Ich würde ein Rekursion immer vermeiden wenn es eine gut iterative Lösung gibt, weil eine Rekursion bei jedem Funktionsaufruf den Speicher belastet. Rekursion ist immer dann angebracht wenn die iterative Lösung zu komplex wird.
Iterative:
Java:
static long facIterativ(int n) {
        long result = 1;
        for (int i = 2; i <= n; ++i)
            result *= i;
        return result;
    }
Rekursive: ohne Member auch das else kann Du Dir sparen.
Java:
    static long factRekursiv(long n) {
        if (n == 1)
            return 1;
        return factRekursiv(n - 1) * n;
    }

Jetzt zur Frage wie schreib man das rekursiv so hin, dass es keine Endrekursion mehr ist?
Ich sehe das so:
Aus meiner Sicht macht das keinen Sinn. Bei einer Endrekursion kann die JVM optimieren und sich das Zwischenspeichern der Speicherzustände einsparen. Eine, so wie Du sie nennst richtige Rekursion, wäre ja dann eine Verschlechterung der Lösung.
Wichtig ist es aber zu wissen, dass bei einer Endrekursion wahrscheinlich ein einfache iterative Lösung existiert.
Die sollte man wählen, da es die bessere Lösung ist.
Sag mir aber bitte bescheid, was Dein Professor damit gemeint hat
:)

Eventuell so etwas
Java:
static long factRekursivStupid(long n) {
        long tmp = n;
        if (n > 1)
            tmp = n * factRekursivStupid(n - 1);
        return tmp;
    }
;)
 
Zuletzt bearbeitet:

Blender3D

Top Contributor
static long factRekursiv(long n) {
if (n == 1)
return 1;
return factRekursiv(n - 1) * n;
}
Korrektur: Da hier der letzte Aufruf mit einer Multiplikation verknüpft ist, handelt es sich hier nicht um eine Endrekursion. Also ist das bereits die gesuchte nicht so gute Lösung.
Endrekursion:
Java:
static long factEndRecursiv(long n, long akk) {
        if (n == 1)
            return akk;
        return factEndRecursiv(n - 1, akk * n);
    }
:):rolleyes::)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R rekursive und iterative Methode Allgemeine Java-Themen 3
A Binominalkoeffizient als rekursive Java-Methode Allgemeine Java-Themen 8
J Rekursive Methode und if-Blöcke, was wird noch ausgeführt? Allgemeine Java-Themen 2
P Bitte kritisieren: rekursive Sortier-Methode Allgemeine Java-Themen 2
zwigglewiggle Rekursive Primfaktorzerlegung Allgemeine Java-Themen 9
J Rekursive Programmierung-Zählen von Ziffern Allgemeine Java-Themen 5
S Rekursive Suche in einem Netz Allgemeine Java-Themen 5
MiMa Rekursive Methoden Allgemeine Java-Themen 3
Private Void rekursive vs. iterative Lösung für Berechnung der Fakultät Allgemeine Java-Themen 12
M Rekursive Ausgabe einer linkedList Allgemeine Java-Themen 8
T Rekursive RegExps wie? Allgemeine Java-Themen 8
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Sinn einer toString Methode Allgemeine Java-Themen 3
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L ToString-Methode Allgemeine Java-Themen 6
X Datentypen NPE in längerer Methode Allgemeine Java-Themen 12
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
P Methoden Anwendung der allMatch()-Methode Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
D Methoden Methode zum Steinschnitt Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
snipesss Methode greift nicht auf JTextPanel zu Allgemeine Java-Themen 3
R Methode in Methode voraussetzen Allgemeine Java-Themen 8
S Überschriebene Methode der Oberklasse der Oberklasse aufrufen. Allgemeine Java-Themen 5
D Methode dynamisch aufrufen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
KaffeeFan Methoden Suche Methode um Programm kurz warten zu lassen Allgemeine Java-Themen 22
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
BRoll Methode abbrechen (Invoke von außen) Allgemeine Java-Themen 5
I Methode verallgemeinern (Methode als Parameter)? Allgemeine Java-Themen 10
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
G Threads Methode nebenbei ausführen, Status verarbeiten Allgemeine Java-Themen 4
H FTP Befehl/Java Methode für Submit im z/Os (Host) Allgemeine Java-Themen 1
M Fabrik Methode, gutes Beispiel? Allgemeine Java-Themen 0
M WebService - Zugriff auf Webservice Methode über Browser Allgemeine Java-Themen 1
N WaitForScript- methode in javafx Allgemeine Java-Themen 1
2 jede Stunde Methode ausführen Allgemeine Java-Themen 8
M Eine static-Methode verlassen Allgemeine Java-Themen 2
P "Overriden statische Methode" Statische Methode die vererbt wird Allgemeine Java-Themen 5
X Komponente an Methode übergeben Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben