Fakultäten in Java berechnen



  • Weil die einzelnen Fakultäten sukzessive über den Vorgänger berechnet werden.

    f[0] = 1;
    f[1] = 1 * f[0] = 1 * 1 = 1;
    f[2] = 2 * f[1] = 2 * 1 = 2;
    f[3] = 3 * f[2] = 3 * 2 = 6;
    usw...
    


  • Fakultät berechnen schreit ja quasi nach Rekursion: 😉

    public class Fakultaet 
    { 
        long fakultaet(int x)
        {
         	if (x == 0) {
                return 1;
          	} else {
                return x * fakultaet(x-1);
            }
        }
    
        public static void main(String[] args) 
        { 
                System.out.print("Die Fakultaet von 13 ist "); 
                System.out.println(fakultaet(13)); 
        } 
    }
    

    😃



  • Ajaw schrieb:

    Fakultät berechnen schreit ja quasi nach Rekursion: 😉

    Sieht toll aus, aber bei Fakultät ist Rekursion genau das, was man nicht benutzen sollte.


  • Mod

    Entenverwickler schrieb:

    Ajaw schrieb:

    Fakultät berechnen schreit ja quasi nach Rekursion: 😉

    Sieht toll aus, aber bei Fakultät ist Rekursion genau das, was man nicht benutzen sollte.

    Warum nicht? Ich verstehe diesen Einwand ja, wenn es um Fibonaccizahlen oder so geht. Aber bei der Fakultät? Meinst Du, Java hat mit 13 rekursiven Aufrufen ein Problem? 🙂



  • BTW: Größere Zahlen lassen sich berechnen indem du dir selber ne Klasse für größe Zahlen schreibst:

    Naive Implementierung:
    http://loop.servehttp.com/~vertexwahn/oldwiki/public_html_an_turing/BigInt.java



  • Vertexwahn schrieb:

    BTW: Größere Zahlen lassen sich berechnen indem du dir selber ne Klasse für größe Zahlen schreibst:

    Naive Implementierung:
    http://loop.servehttp.com/~vertexwahn/oldwiki/public_html_an_turing/BigInt.java

    Da gibt es schon eine Klasse, nämlich java.math.BigInteger



  • Zum Fall Fakultät berechnen gibt es grundsätzlich zwei Methoden:

    1. Iteration while (!exit) {...} oder for (...) {...}

    2. Rekursion recursiveFunction(int value) ruft "rekursiv" recursiveFunction(int value)

    Beide Methoden haben ihre Vor- un Nachteile:

    1. Häufig ist der Code simpler aber dafür muss man einen möglichen Stack-Overflow im Auge behalten.

    2. Iterartion rufen sich nicht selber auf, darum wird deshalb kaum ein Stack-Overflow riskiert.
      Dafür muss jedoch für etwas mehr "Infrastruktur" gesorgt werden.

    Sollte man besser und tiefer erklären, aber zum Thema kann ich nicht mehr beitragen! 🙂

    Zur Demonstration einer rekursiven Funktion wird gerne das Problem der FakultätsBerechnung genommen.
    Fazit: Hierzu sollte eine Fülle an Infos zu finden sein!



  • Iterativ:

    public static long fakultaet(long n) {
        long ret = 1;
        for(int i = 1; i <= n; ++i) {
            ret *= i;
        }
        return ret;
    }
    

    rekursiv:

    public static long fakultaet(long n) {
        if(n = 1)
            return 1;
        else
            return n * fakultaet(n-1);
    }
    

    Hoffe, dass die Rekursion so stimmt.



  • Nein, ist sie nicht. Erstens gilt 0!=1 und sollte damit das Abbruchkriterium sein und zweitens wird bei deiner Version, bei n<1, mit hunderprozentiger Sicherheit eine Stackoverflow-Exception auftreten.

    Gruss



  • dgsgdter schrieb:

    und zweitens wird bei deiner Version, bei n<1, mit hunderprozentiger Sicherheit eine Stackoverflow-Exception auftreten.

    Nein! Es wird mit 100% Sicherheit keine Stackoverflow-Exception auftreten.

    Dazu müßte das Programm erst mal laufen
    und dazu erst mal kompilierbar sein.
    ( if(n = 1) )

    😃
    *SCNR*


Anmelden zum Antworten