# Nutzung von Hilfsmethoden



## hybi (29. Nov 2013)

Moin zusammen,
ich bin ein relativer Anfänger in Java und bräuchte Mal Tipps wie man mehrere Methoden bzw. Hilfsmethoden anwendet.

Ich habe zur Übung einen Code geschrieben, bei dem das Produkt zweier Zahlen durch Addition einer der beiden Zahlen erfolgen soll (sprich, 4*5 soll durch 4+4+4+4+4 errechnet werden).


```
public class neu
{
public static int mul(int i, int g) {
    if (i == 0 || g == 0)
        return 0;
    if (i == 1)
        return g;
    if (g == 1)
        return i;
    if (i < 0 && g < 0)
        return mul(i * -1, g * -1);
    if (i < 0)
        return -1 * mul(i * -1, g);
    if (g < 0)
        return -1 * mul(i, g * -1);
    return i + mul(i, g - 1);
}
	public static void main(String[] args){
		System.out.println("Result: = "+neu.mul(6, 9));
	}
}
```

Nun möchte ich dies auf zwei Methoden aufteilen, die Rekursion soll bspw. in der Methode mul2 erfolgen. Wie ich das auch umschreibe, es funktioniert im Endeffekt nicht.
Jemand der klüger ist als ich?

Vielen Dank im voraus!


----------



## rme (29. Nov 2013)

Könntest du einen deiner fehlerhaften Versuche zeigen, damit wir sehen, wo dein Verständnisproblem liegt?


----------



## hybi (29. Nov 2013)

Wahrscheinlich ist das ein generelles Verständnisproblem, es sollen halt zwei Methoden werden die sich gegenseitig ergänzen:


```
public class neu
    {
    // Methode 1 //

    public static int mul(int i, int g) {
        if (i == 0 || g == 0)
            return 0;
        if (i == 1)
            return g;
        if (g == 1)
            return i;

    // Hier dann Methode 2 zb mul2 //

    public static int mul2(int i, int g) {
        if (i < 0 && g < 0)
            return mul(i * -1, g * -1);
        if (i < 0)
            return -1 * mul(i * -1, g);
        if (g < 0)
            return -1 * mul(i, g * -1);
        return i + mul(i, g - 1);
    }
    // Zum Schluss müssen sich die beiden ergänzen, in der Form fehlt sicherlich einiges  //
        public static void main(String[] args){
            System.out.println("Result: = "+neu.mul(6, 9));
        }
    }
```

Ich hoffe das Problem ist nun besser verständlich. Es sei denn es ist gar nicht machbar wie ich mir das gedacht habe


----------



## rme (29. Nov 2013)

Bei mul fehlt die schließende geschweifte Klammer. Du behandelst da ja alle Sonderfälle und möchtest, dass danach mul2 aufgerufen wird, nehme ich. Dies musst du dann auch tun:


```
public static int mul(int i, int g) {
        if (i == 0 || g == 0)
            return 0;
        if (i == 1)
            return g;
        if (g == 1)
            return i;
        return mul2(i, g);
}
```

Oder habe ich falsch verstanden, was dein Plan war?


----------



## hybi (29. Nov 2013)

Genau, mul soll einfach an mul2 sozusagen übergeben. Ich möchte einfach probieren mit zwei Methoden zu arbeiten.
Hier mal der upgedatetete Code:


```
public class neu
{
public static int mul(int i, int g) {
    if (i == 0 || g == 0)
        return 0;
    if (i == 1)
        return g;
    if (g == 1)
        return i;
        return mul2(i, g);
}     
public static int mul2(int i, int g) { 
    if (i < 0 && g < 0)
        return mul2(i * -1, g * -1);
    if (i < 0)
        return -1 * mul2(i * -1, g);
    if (g < 0)
        return -1 * mul2(i, g * -1);
    return i + mul2(i, g - 1);
}
	public static void main(String[] args){
		System.out.println("Result: = "+neu.mul2(6, 9));
	}
}
```

Hab bestimmt noch was übersehen. Das Problem ist jetzt die Ausgabe, beide Möglichkeiten sollen ja ausgebbar sein. Pack ich das beides in die main Methode oder noch in die jeweilige Methode? Klappt irgendwie alles nicht


----------



## rme (29. Nov 2013)

Hm. Soll man mul2 denn wirklich von außen aufrufen können? Da fehlen ja die wichtigen Überprüfungen der Sonderfälle.  Oder was meinst du mit "beide Möglichkeiten ausgebbar"? Ich würde von außen nur mul aufrufen, das prüft auf Sonderfälle und gibt entweder direkt Werte zurück, oder delegiert das eigentliche Rechnen an deine Methode mul2.

In mul2 solltest du allerdings überlegen, ob in allen Fällen direkt wieder mul2 aufgerufen werden kann, oder ob ein Sonderfall möglich ist und die Rekursion deshalb wieder an mul gehen sollte.


----------



## hybi (29. Nov 2013)

rme hat gesagt.:


> Hm. Soll man mul2 denn wirklich von außen aufrufen können? Da fehlen ja die wichtigen Überprüfungen der Sonderfälle.  Oder was meinst du mit "beide Möglichkeiten ausgebbar"? Ich würde von außen nur mul aufrufen, das prüft auf Sonderfälle und gibt entweder direkt Werte zurück, oder delegiert das eigentliche Rechnen an deine Methode mul2.


Wie gesagt, weder die Ausgabe
*System.out.println("Result: = "+neu.mul(6, 9));*
noch
*System.out.println("Result: = "+neu.mul2(6, 9));*
bringt eine Ausgabe sondern die Fehlermeldung
*Exception in thread "main" java.lang.StackOverflowError
	at neu.mul2(neu.java:20)
	at neu.mul2(neu.java:19)*

Womöglich ist der ganze Ansatz ja falsch, es soll aber doch möglich sein zwei Methoden zu "kombinieren", weiß nur nicht wie...Irgendeine Idee? Oder kennt wer Tutorials die das gut erklären und ich für diesen Zweck nutzen könnte?


----------



## rme (29. Nov 2013)

Das dürfte daran liegen, dass du eben innerhalb von mul2 wieder mul2 aufrufst - dadurch werden die Abbruchbedingungen nie erreicht und die Rekursion setzt sich unendlich fort, bis die JVM irgendwann abbricht, weil der Stack voll ist (Java ist keine Sprache, die zur Umsetzung von rekursiven Funktionen sonderlich geeignet ist).


----------



## hybi (29. Nov 2013)

Tatsache, das war der Fehler 
Hab jetzt innerhalb von mul2 auf mul geändert, so funktioniert's. Danke dir!

Ist wahrscheinlich nicht ganz der Sinn einer Hilfsmethode (was mul2 eigentlich werden sollte), aber immerhin.


----------



## rme (29. Nov 2013)

Ist es denn dein Ziel, Java zu lernen? Dein Stil ist sehr funktional geprägt - wenn du ihn beibehalten möchtest wäre eine andere Sprache evtl. einfacher / sinnvoller für dich, falls es dir nur um's Programmieren und nicht speziell um Java geht


----------



## hybi (29. Nov 2013)

Ziel ist Grundkenntnisse in Java zu erlangen, will also kein Profi werden. Das steht jetzt erstmal auf dem Programm, groß programmieren will ich ebenfalls nicht, aber Einsteigerwissen kann ja nicht schaden.


----------

