Rekursive Methode Stack Overflow

Csircc

Mitglied
Hey ich soll eine Rekursive Methode ohne for oder while schleifen schreiben.
Ich hab mein bestes versucht bekomme beim Ausführen jedoch einen stack overflow. Das liegt meines wissens daran, dass die Vabiable ich beim ausführen immer wieder zurück gesetzt wird. aber ich weiß nicht wie ich das ändern kann. Hilfe!!

Java:
public class Rekursiv
{

    public static int apply(int[] arr, int i)
    {
        int x=0;
        int j=0;

        if (0 <= i && i<arr.length)
        {

            if (0<=x && x<=i)
            {
                x++;
                if(arr[x]<4 && arr[x]>(-4))
                {
                    j++;

                }

                apply(arr, i);
            }

        }
        else
        {
            return 0;
        }
        return j;
    }
}
 

mihe7

Top Contributor
Beim rekursiven Aufruf muss es einen Unterschied zum ursprünglichen Aufruf geben (in der Regel ändert sich direkt etwas an den Parametern), ansonsten wirst Du nie die Abbruchbedingung erreichen :)
 

Csircc

Mitglied
das hört sich logisch an! Ich sehe aber nicht an welcher stelle ich da was verändern kann. (Wahrscheinlich wegen mangelnder Erfahrung.

Das ist die Aufgabenstellung.
Vervollständige die Klasse Testat mit der Methode apply, die folgende Signatur besitzt:
public static int apply( int[] arr, int i )

Die Methode apply soll die folgende Funktionalität bereitstellen:
• Die Methode apply muss rekursiv arbeiten. Bei der Implementierung von apply dürfen die Schlüsselwörter for und while nicht verwendet werden. • Für alle i mit 0<=arr.length soll die Methode apply ermitteln, für wie viele x mit 0<=x<=i der Wert von arr[x] echt größer als -4 und echt kleiner als +4 ist. Die ermittelte Anzahl soll zurückgegeben werden.
• Für alle i, die außerhalb des Bereichs 0<=i<arr.length liegen, soll die Methode apply den Wert 0 zurückgeben.
• Es dürfen keine Attribute und keine weiteren Methoden in der Klasse Testat angelegt werden.
• Die Methode apply muss in einem Programm mehrfach nacheinander aufgerufen werden können und bei jedem Aufruf das entsprechend der Aufgabenbeschreibung korrekte Ergebnis zurückgeben.
 

mihe7

Top Contributor
Vielleicht mal ein Beispiel:
Java:
public void countDown(int n) {
    if (n <= 0) {
        return;
    }
    System.out.println(n);
    countDown(n-1);
}
Zeile 2 prüft die Abbruchbedingung. Ist sie erfüllt, d. h. gilt n <= 0, dann ist die Sache erledigt und die Rekursion wird in Zeile 3 beendet.

Ansonsten (d. h. n > 0) wird in Zeile 5 das n ausgegeben. In Zeile 6 wird nun die Methode rekursiv aufgerufen. Diesmal jedoch mit n-1.

Ruft man also countDown(2) auf, wird die 2 ausgegeben, anschließend wird countDown(1) aufgerufen. Es wird die 1 ausgegeben, anschließend wird countDown(0) aufgerufen. Jetzt ist die Abbruchbedingung erfüllt, die Rekursion wird beendet.
 

Csircc

Mitglied
Ich hab jetzt ein bisschen rumprobiert. Das hat mir beim Verständnis der Rekursion sehr weiter geholfen jedoch funktioniert es immer noch nicht richtig (aber wenigstens kein Overflow mehr.) Gegeben werden mir jetzt aber nicht die Anzahl der indizies an deren stelle die bedingung erfüllt ist.
Java:
public static int apply(int[] arr, int i)
    {

        int x=i;
        int j =0;
        
        
        if (0 <= i && i<arr.length)
        {

            if (0<=x && x<=i)
            {

                if(arr[x]<4 && arr[x]>(-4))
                {
                    j++;
                    
                }
                if(x >0)
                {
                    apply(arr,x-1);
                }
                else
                {
                    return j;
                }
            }

        }
        else
        {
            return 0;
        }
        return j;
    }
 
K

kneitzel

Gast
Das generelle Vorgehen einer Rekursion ist oft:
- Check: Bin ich fertig? -> Ergebnis zurückgeben
- Aktuelles Element auswerten und zusammen mit Ergebnis der restlichen Elemente das Ergebnis ermitteln und zurück geben.

Deine rekursive Methode hat einen Rückgabewert. Aber beim rekursiven Aufruf interessiert Dich das Ergebnis nicht. Das sieht nicht wirklich korrekt aus.
 

Csircc

Mitglied
Ich hab aber das problem, dass ich die variable mit 0 initialisiere und dann beim Rekursiven aufruf ich diese immer wieder auf 0 zurück setze
 

fhoffmann

Top Contributor
Schreibe dein Programm folgendermaßen:

1. Wenn i < 0 oder i >= arr.length: gib 0 zurück.
2. Ruf apply(arr, i-1) auf und merke dir den Rückgabewert!
3. Wenn das Array an der Stelle i zwischen -4 und 4 liegt, addiere 1 zu der gemerkten Zahl.
4. Gib diese Zahl zurück.
 

Csircc

Mitglied
Habs, danke euch sehr!!!
Java:
public static int apply(int[] arr, int i)
    {
        int x=i;
        int k=0;
        if(x<0)
        {
            return k;
        }
        if(0<=i && i<arr.length)
        {
            if(arr[x]>(-4) && arr[x]<4)
            {
                k=1 + apply(arr,i-1);
            }
            else
            {
                k= apply(arr, i-1);
            }
        }
        return k;
    }
 

Csircc

Mitglied
Das generelle Vorgehen einer Rekursion ist oft:
- Check: Bin ich fertig? -> Ergebnis zurückgeben
- Aktuelles Element auswerten und zusammen mit Ergebnis der restlichen Elemente das Ergebnis ermitteln und zurück geben.

Deine rekursive Methode hat einen Rückgabewert. Aber beim rekursiven Aufruf interessiert Dich das Ergebnis nicht. Das sieht nicht wirklich korrekt aus.
Hat mir sehr geholfen danke!
 

mihe7

Top Contributor
Ein paar Anmerkungen:
  1. Du kannst, wie von @fhoffmann vorgeschlagen, den Aufruf in Zeile 17 noch vor das if ziehen. Dann hast Du nur einen rekursiven Aufruf im Code, musst im then-Teil nur noch k um 1 erhöhen und der else-Teil fällt weg.
  2. Ich würde in der Abbruchbedingung auch nicht k sondern ganz klar 0 zurückgeben.
  3. Wofür Du eine Variable x benötigst, leuchtet auch nicht ganz ein, das i wird im Code ja nirgends verändert.
  4. Die Bedingung 0<=i (also i >= 0) ist überflüssig, da zuvor schon der Fall i < 0 abgefangen wurde.
  5. Leerraum erleichtert das Lesen
Das liefert zunächst:
Java:
    public static int apply(int[] arr, int i) {
        if (i < 0) {
            return 0;
        }

        int k=0;
        if (i < arr.length) {
            k = apply(arr, i-1);
            if (arr[i] > (-4) && arr[i] < 4) {
                k++;
            }
        }

        return k;
    }
Die Bedingung des zweiten ifs sorgt dafür, dass im Fall von i >= arr.length einfach 0 zurückgegeben wird. Das könnte man auch zu Beginn abfangen und so erhält man
Java:
    public static int apply(int[] arr, int i) {
        if (i < 0 || i >= arr.length) {
            return 0;
        }

        int k = apply(arr, i-1);
        if (arr[i]>(-4) && arr[i]<4) {
            k++;
        }

        return k;
    }
Das erste if entspricht dann auch genau der Anforderung der Aufgabenstellung: "Für alle i, die außerhalb des Bereichs 0<=i<arr.length liegen, soll die Methode apply den Wert 0 zurückgeben."

Das nur nebenbei, Dein Code ist ja nicht falsch.

Was mir in der Aufgabenstellung noch fehlt ist, mit welchem i die Methode apply später aufgerufen werden soll: mit 0 oder mit arr.length-1? Falls die Methode mit 0 augerufen werden soll, musst Du natürlich den rekursiven Aufruf anpassen, denn dann würde ja von unten nach oben gezählt.
 
Ä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
C Rekursive Methode in Interative Methode umwandeln Java Basics - Anfänger-Themen 17
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