Nutzung von Hilfsmethoden

hybi

Mitglied
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).

Java:
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!
 

hybi

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

Java:
    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 :D
 

rme

Top Contributor
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:

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

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

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

Top Contributor
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.
 
Zuletzt bearbeitet:

hybi

Mitglied
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

Top Contributor
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

Mitglied
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

Top Contributor
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

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

Ähnliche Java Themen

Neue Themen


Oben