StackOverflow für Eingabewerte berechnen

Hallo,

Ich muss für die Uni eine Aufgabe machen, in der ich gezwungen bin, durch Rekursion den größten gemeinsamen Teiler zweier Zahlen zu berechnen und zurückzugeben.
Die Funktion sollte eigentlich stimmen. Jedoch werfen manche eingaben einen StackOverflowError zurück. Da ich die Rekursion verwenden muss, wäre es mir also nur möglich, anhand der Größe der eingegebenen Werte vorzeitig eine Fehlermeldung zurückzuwerfen.

Java:
private static int gcd(int i, int j) {
    if (i < 0) return gcd(-i, j);
	if (j < 0) return gcd(i, -j);
	if (i == j) return Math.abs(i);
	if (i > j) return gcd(i - j, j);
	else return gcd(j, i);
}

Die Frage ist nun aber woher ich weiß, für welche Werte der Stack überläuft.
So ungefär müssten es ja große Werte sein, die einen geringen Abstand zueinander haben. Zum Beispiel bei 100000 und 100001:
100000 100001
100001 100000
1 100000
100000 1
99999 1
99998 1
und so weiter.

Ich hoffe jemand weiß, wie man es berechnen kann, damit ich vorher schon die entsprechenden Werte begrenzen kann.
 
Du kannst statt
Code:
-
auch modulo verwenden, dann bist du schneller fertig.
Außerdem fehlt dir eine Abbruchbedingung, nämlich 0
 
Zuletzt bearbeitet:
Du kannst statt
Code:
-
auch modulo verwenden, dann bist du schneller fertig.
Außerdem fehlt dir eine Abbruchbedingung, nämlich 0

Natürlich, auf das modulo hätte man eigentlich kommen können, so gehts auch mit den großen Werten.
Die Abbruchbedingung ist beim kopieren verloren gegangen:
statt [Java]if (i == j) return Math.abs(i);[/code]
Java:
if (i == j) return i;
if (j == 0) return Math.abs(i);

Ich werde dann wohl mal fragen müssen, ob ich den eigentlichen Algoithmus so verändern darf. Danke für die Antwort.
Wenn jemand weiß, wie man den Stackoverflow berechnet, würde mich das aber dennoch interesseren ;-)
 
Hm, bisschen viele Abfragen hast du da.
Java:
public int gcd(int a, int b) {
  return gcdHelp((int) Math.abs(a), (int) Math.abs(b))
}
private int gcdHelp(int a, int b) {
  return b == 0 ? a : gcdHelp(b, a % b)
}
Reicht eigentlich. Es muss ja nicht jedes mal getestet werden ob die Werte positiv sind.
 

Zurück
Oben