Datentypen Warum so nur Fakultät nur bis 8?

iTutHD

Mitglied
Hallo,
Ich habe eine frage zum meinem folgenden Code.

Code:
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        long x = 0;
        if(args.length == 1){
            x = Long.parseLong(args[0]);
        }
        else{
            System.err.println("Fehler bei Kommandoübergabe!");
        }
        System.out.println(fact(x));
    }
   
    public static long add(long x, long y){
        return x + y;
    }
   
    public static long mult(long x, long y){
        if (y > 1){
            return (mult(x,y-1)+x);
        }
        else{
            return x;
        }
    }
   
    public static long fact(long x){
        if(x > 1){
            return (mult(x, fact(x - 1)));
        }
        return x;
    }

Ich habe die Übungsaufgabe bekommen, eine rekursive Implementation zu schreiben um nur mit hilfe von Addition zu multiplizieren. Dafür habe ich die Methode mult gemacht. Diese muss laut aufgabenstellung die Methode add zum addieren benutzen, welche nur die Übergabe von 2 zahlen unterstützt. Dannach sollte ich das gleiche für die berechenung von Fakultäten machen und dazu die Methode mult rekursiv aufrufen.
Meine Frage ist jetzt folgende. Warum kann mein Code nur bis Fakultät 8 rechnen? Ich benutze ja die ganze Zeit den Datentyp long welcher ja mit seinen 64-Bit die zur Verfügungstehen weiter als bis 40320 kommen können sollte.

Kann mir wer erkären, wie genau das zustande kommt? Es geht mir nicht darum, dass ich das Programm weiter rechnen lassen können muss, sondern nur um eine verständliche Erklärung warum dies so ist.

Danke und grüße!
 

Dompteur

Top Contributor
Hast du etwas den Fehler "java.lang.StackOverflowError" bekommen ?
Bei rekursiven Methoden Programmieren muss man sich irgendwann mit der Stack-Größe beschäftigen. Bei dir ist es nun soweit.

Wenn ich den Stackspace beispielsweise auf 2 MByte vergrößere ( -Xss2m ), dann kann ich auch 9! berechnen.
 

InfectedBytes

Top Contributor
Erstmal zwei allgemeine Sachen:
1. Du sagst selber du sollst bei der Multiplikation nur deine Add Methode benutzen, das tust du aber nicht
2. Deine Multiplikation funktioniert nur mit Zahlen größer gleich eins

Nun zum Problem, durch die ganzen rekursiven Aufrufe erhälst du eben eine StackOverflowException. Hauptproblem ist hier vor allem deine rekursive Multiplikationsmethode. Betrachte einfach mal das Beispiel 10*10, hier würde eine multiplikationsmethode sich selbst 9 weitere male aufrufen. Bei der Fakultät hast du aber weitaus größere Zahlen, sodass du unmengen an rekursiven Aufrufe hast.
 

Robat

Top Contributor
Wenn du mehr ausrechnen möchtest, dann solltest du es nicht rekursiv implementieren:

Java:
    if ( n >= 0 )
    {
      while ( n > 1 )
      {
        fakultaet = fakultaet * n;
        n   = n - 1;
      }
      System.out.println( "Fakultaet ist " + fakultaet );
    }
 

iTutHD

Mitglied
Danke für die Antworten!
Die Antworten haben mir sehr geholfen!

@InfectedBytes
Zu 1.: Jop stimmt habe ich zur Fehlersuche geändert und vergessen wieder raus zu nehmen...
habe jetzt die zeile abgeändert :)
Zu 2.: Danke habe ich noch nicht so drüber nachgedacht... Bessere ich gleich aus.
Ich soll ja leider Rekursion benutzen. Soll das ganze denke ich nur nochmal als Übung verdeutlichen aber danke für deine itterative Lösung!

@Dompteur

Danke! Mit -Xss2m klappt es noch nicht aber mit 4 irgend wie schon

Sollte so alle Fehler behoben haben oder?
Code:
package rekursion;

public class fakultaet {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        long x = 0;
        if(args.length == 1){
            x = Long.parseLong(args[0]);
        }
        else{
            System.err.println("Fehler bei Kommandoübergabe!");
        }
        System.out.println(fact(x));
    }
   
    public static long add(long x, long y){
        return x + y;
    }
   
    public static long mult(long x, long y){
        if (y > 1){
            return (add(x,mult(x,y-1)));
        }
        else if(y < 1){
            return(add(y,mult(y, x-1)));
        }
        else{
            return x;
        }
    }
   
    public static long fact(long x){
        if(x > 1){
            return (mult(x, fact(x - 1)));
        }
        return x;
    }
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
L mit Fakultät mathematische Formel berechnen Java Basics - Anfänger-Themen 5
K Fakultät Java Basics - Anfänger-Themen 5
B Java Array Fakultät Function Java Basics - Anfänger-Themen 5
K Rekursive Methode für Fakultät mit BigInteger Java Basics - Anfänger-Themen 10
K Fakultät Java Basics - Anfänger-Themen 16
C Erste Schritte Negative Zahlen als Fakultät ablehnen Java Basics - Anfänger-Themen 2
P Problem bei Fakultät mit "for"-Schleife Java Basics - Anfänger-Themen 12
M Fakultät berechnen Java Basics - Anfänger-Themen 2
A Fakultät probleme Java Basics - Anfänger-Themen 1
Z Schleifen Beispiel: Fakultät Java Basics - Anfänger-Themen 26
P Fakultät aus Zahl bilden Java Basics - Anfänger-Themen 5
K Fakultät zurückrechnen Java Basics - Anfänger-Themen 7
V Rekursion und Fakultät Java Basics - Anfänger-Themen 4
N Fakultät Java Basics - Anfänger-Themen 9
P Methoden Fakultät und Fehlerwert berechnen Java Basics - Anfänger-Themen 7
Fab1 Project Euler problem20 Fakultät von 100 Java Basics - Anfänger-Themen 13
S Erste Schritte Fakultät Quellcode Java Basics - Anfänger-Themen 12
L Fakultät Java Basics - Anfänger-Themen 2
G vielfache, fakultät und primzahltest Java Basics - Anfänger-Themen 35
M Fakultät Java Basics - Anfänger-Themen 13
J Fakultät- Programm programmieren Java Basics - Anfänger-Themen 10
W Fakultät, warum Endlosschleife? Java Basics - Anfänger-Themen 15
W Fakultät Java Basics - Anfänger-Themen 9
J Fakultät und Rekursion Java Basics - Anfänger-Themen 9
V Überlauf Fakultät Java Basics - Anfänger-Themen 4
L Fakultät Programm ! Java Basics - Anfänger-Themen 7
M Problem mit Berechnung der Fakultät Java Basics - Anfänger-Themen 3
B Berechnugn der Fakultät Java Basics - Anfänger-Themen 3
M Fakultät berechnen Java Basics - Anfänger-Themen 2
R Fakultät einer Zahl errechnen. Java Basics - Anfänger-Themen 7
M Brauche Hilfe mit Fakultät! Java Basics - Anfänger-Themen 16
N java befehl für fakultät Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben