# StackOverflowError - Schleife funktioniert nicht richtig



## sg99 (27. Nov 2020)

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!



```
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);
    }

}
```


----------



## mihe7 (28. Nov 2020)

Das if-Statement in mehrfachDivision betrifft nur die Ausgabe. Das return wird in jedem Fall ausgeführt....


----------



## MoxxiManagarm (28. Nov 2020)

Die Mehrfachdivision ist eine Rekursion. Für jede Rekursion brauchst du eine Abbruchbedingung.


----------



## sg99 (28. Nov 2020)

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? 


MoxxiManagarm hat gesagt.:


> Die Mehrfachdivision ist eine Rekursion. Für jede Rekursion brauchst du eine Abbruchbedingung.


----------



## kneitzel (28. Nov 2020)

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 (29. Nov 2020)

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 (29. Nov 2020)

Also, nochmal ausführlich. Dein Code

```
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:

```
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 (29. Nov 2020)

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 😅.


----------



## mihe7 (29. Nov 2020)

Du kannst Dir mal https://www.java-forum.org/thema/werte-eines-arrays-addieren.118668/post-1238088 ansehen, da habe ich gerade was zur Rekursion geschrieben. Vielleicht hilft es beim Verständnis.


----------

