StackOverflowError - Schleife funktioniert nicht richtig

sg99

sg99

Mitglied
Hallo,
leider funktioniert mein Code nicht so wie er soll. Der Plan ist a und b werden im Terminal eingelesen (was auch funktioniert). Und dann wird a solange durch b geteilt, bis a<b gilt. (Dabei soll der Wert von a ständig überschrieben werden). Die Ergebnisse werden auch angezeigt, jedoch stoppt mein Programm nicht. Habt ihr eventuell Hinweise, was ich tun könnte, um das zu beheben? Schleifen sind bislang noch nicht meine Stärke. Habe auch schon ein wenig herumprobiert, aber keine bessere Lösung gefunden. Vielen Dank schonmal!


Java:
public class division {
    public static void main(String[] args) {
        
        System.out.println("Gib eine ganze Zahl a ein");
        int a = Terminal.readInt(); //Methode aus anderer Klasse importiert
        System.out.println("Gib eine ganze Zahl b ein");
        int b = Terminal.readInt();
        int i;
        System.out.println("Gib eine ganze Zahl b ein");
        System.out.println();
        System.out.println("Die Ergebnisse sind: ");
        
for(i=0; i<=12; i++) {
            System.out.println( a  + mehrfachDivision(a,b));
        break;
        }
    }
    
    public static int mehrfachDivision(int a, int b) {
        if (a>=b)
            System.out.println(a);
            return mehrfachDivision(a/=b, b);
    }

}
 
sg99

sg99

Mitglied
Hey, das ich eine Abbruchbedingung benötige ist mir klar. Ich denke ich würde das hinbekommen, wenn die Methode nur von einer int abhängig wäre, aber leider ist meine Aufgabe so gestellt, dass ich a und b nicht als konstant betrachten kann und ich feststehenden keinen Fall n0 und n1 habe, aus denen ich eine rekursive Folge aufbauen könnte. Hättest du vielleicht noch einen Hinweis?
Die Mehrfachdivision ist eine Rekursion. Für jede Rekursion brauchst du eine Abbruchbedingung.
 
kneitzel

kneitzel

Top Contributor
Ist das Problem denn nicht schon von @mihe7 genau benannt?

Du willst die Ausgabe und den rekursiven Aufruf doch nur machen, wenn die Bedingung im if erfüllt ist. Die Einrückung hast Du ja entsprechend manuell gemacht nur eben ist das Java und nicht Python!
 
sg99

sg99

Mitglied
Erstmal danke für eure Antworten. Lerne erst seit ein paar Tagen Java und habe auch sonst keine Programmiererfahrung. Ich denke mal ohne return wird es schwierig. Wie kann ich dafür sorgen, dass die Methode nicht mehr Werte als nötig zurückgibt. Kann ich das if statement erweitern und wenn ja, mit welcher Bedingung? Habe schon rumprobiert. Eine Idee war, es mit einer while-Schleife zu versuchen, aber dazu müsste sich ja der Wert a dahingehend verändern, dass jeweils a=a/b gilt. Ist das ein sinnvoller Gedanke? Wenn ja wie setze ich das um?
 
mihe7

mihe7

Top Contributor
Also, nochmal ausführlich. Dein Code
Java:
    public static int mehrfachDivision(int a, int b) {
        if (a>=b)
            System.out.println(a);
            return mehrfachDivision(a/=b, b);
    }
macht folgendes: Falls a >=b ist, dann wird a ausgegeben. Unabhängig von der Frage, ob a >= b gilt, wird die Zeile 4 ausgeführt und damit mehrfachDivision erneut aufgerufen. Der Grund dafür ist, dass Du keine geschweiften Klammern verwendet hast. Zwischenschritt: erstmal die Klammern einbauen:
Java:
    public static int mehrfachDivision(int a, int b) {
        if (a>=b) {
            System.out.println(a);
            return mehrfachDivision(a/=b, b);
        }
    }

Damit werden die Zeilen 3 und 4 nur noch ausgeführt, wenn a >= b gilt. Allerdings lässt sich der Code nicht übersetzen, denn für den Fall, dass a < b gilt, ist noch kein Rückgabewert angegeben. Was also, soll zurückgegeben werden, wenn a < b gilt? Und das baust Du am Ende der Methode mit Hilfe von return ein.

Übrigens: a/=b enthält eine unnötige Zuweisung, a/b reicht vollkommen.
 
sg99

sg99

Mitglied
Vielen Dank für euer Hilfe! Dank des Tipps von mihe7 funktioniert es jetzt auch. Muss wohl noch ein besseres Verständnis dafür entwickeln, was ich da genau tue 😅.
 
Anzeige

Neue Themen


Oben