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
  Titel Forum Antworten Datum
D Vorschläge für Umstellung auf Thread-Nutzung erwünscht Java Basics - Anfänger-Themen 11
D GPIO Nutzung mit Pi4J Library auf Raspberry funktioniert nicht Java Basics - Anfänger-Themen 3
I Eigene Java Tools Nutzung Java Basics - Anfänger-Themen 6
H Methoden Nutzung der Werte einer ausgeführten Objektmethode in anderen Objektmethoden Java Basics - Anfänger-Themen 2
S Implementierung der Klasse Konto und Nutzung bereits vorhandener Klassen Java Basics - Anfänger-Themen 7
K Nutzung einer Klasse die das Iterator-Interface implementiert Java Basics - Anfänger-Themen 0
L Datentypen Nutzung von Kommas in Benutzeroberfläche Java Basics - Anfänger-Themen 3
F BufferedImage Speicher Nutzung Java Basics - Anfänger-Themen 2
S Nutzung einer implementierten Schnittstelle Java Basics - Anfänger-Themen 3
C Klassen StackOverflow bei erster Nutzung von Klassen/Konstruktoren Java Basics - Anfänger-Themen 9
L Probleme bei Offline-Nutzung von Java-Applets Java Basics - Anfänger-Themen 6
K Problem bei Hashmap Nutzung Java Basics - Anfänger-Themen 22
M Breite von String für Serverseitige nutzung Berechnen Java Basics - Anfänger-Themen 3
N Hilfsmethoden Java Basics - Anfänger-Themen 1
J eclipse, mehrdimensionale arrays, hilfsmethoden Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben