Fakultaet berechnen



  • Hallo,
    wie funktioniert in diesem Quelltext die Berechnung, der Fakultaet ?
    Klammernausdrücke werde doch zuerst berechnet in C. Dann hätte ich doch für die zahl 4 das Ergebnis 3*4*4!=24.

    #include <stdio.h>
    unsigned long fakultaet(int zahl);
    
    void main (){
    int zahl; 
    unsigned long ergebnis; 
    
    printf("geben sie eine zahl ein:"); 
    scanf("%d", &zahl); 
    
    ergebnis = fakultaet(zahl); 
    
    printf("Fakultät von %d ist %u \n", zahl, ergebnis); 
    
    }
    
    //funktion
    
    unsigned long fakultaet(int zahl)
    {
        unsigned long ergebnis; 
        if (zahl > 1)
            ergebnis = zahl * fakultaet (zahl-1); 
        else 
            ergebnis = 1; 
        return ergebnis; 
    }
    


  • Original erstellt von andro:
    **Dann hätte ich doch für die zahl 4 das Ergebnis 3*4*4!=24.
    **

    Wieso? Im Quelltext ist eine rekursive Version der Fakultät:
    4! = 4*(4-1)! = 4*3! = 4*3*(3-1)! = 4*3*2! = 4*3*2*(2-1)! = 4*3*2*1 (Abbruch der Rekursion)



  • hi,
    ist zwar ein c code, aber das wird hier bestimmt keiner übel nehmen. Dann ist fakultaet also das eigentliche mathem. !, bloss ausgeschrieben und die Berechnung findet von rechts nach links statt ??? 🙂



  • Ich hoffe, das liest sich so als Frage, denn ich bin mir immernochnicht ganz sicher...



  • Sorry war ein Fehler show next post!

    [ Dieser Beitrag wurde am 05.05.2003 um 16:25 Uhr von DaDaywalker editiert. ]



  • Original erstellt von andro:
    **Hallo,
    wie funktioniert in diesem Quelltext die Berechnung, der Fakultaet ?
    Klammernausdrücke werde doch zuerst berechnet in C. Dann hätte ich doch für die zahl 4 das Ergebnis 3*4*4!=24.

    #include <stdio.h>
    unsigned long fakultaet(int zahl);
    
    void main (){
    int zahl; 
    unsigned long ergebnis; 
    
    printf("geben sie eine zahl ein:"); 
    scanf("%d", &zahl); 
    
    ergebnis = fakultaet(zahl); 
    
    printf("Fakultät von %d ist %u \n", zahl, ergebnis); 
    
    }
    
    //funktion
    
    unsigned long fakultaet(int zahl)
    {
        unsigned long ergebnis; 
        if (zahl > 1)
            ergebnis = zahl * fakultaet (zahl-1); 
        else 
            ergebnis = 1; 
        return ergebnis; 
    }
    ```**
    

    Nun also ist doch eigentlich ganz einfach....

    Die Funktion fakultaet ist eine rekursive Funktion.
    Sie wird also in sich selbst gerufen.

    etwas leichter erklärt würde die mathematische Funktion wie folgt aussehen.

    Beispiel: 4:

    [code type="C++"]
    unsigned long fakultaet(4)
    {
    unsigned long ergebnis;
    if (zahl > 1)
    ergebnis = 4 * fakultaet (3);
    else
    ergebnis = 1;
    return ergebnis;
    }

    unsigned long fakultaet(3)
    {
    unsigned long ergebnis;
    if (zahl > 1)
    ergebnis = 3 * fakultaet (2);
    else
    ergebnis = 1;
    return ergebnis;
    }
    unsigned long fakultaet(2)
    {
    unsigned long ergebnis;
    if (zahl > 1)
    ergebnis = 2 * fakultaet (1);
    else
    ergebnis = 1;
    return ergebnis;
    }
    unsigned long fakultaet(1)
    {
    unsigned long ergebnis;
    if (zahl > 1)
    ergebnis = zahl * fakultaet (zahl-1);
    else
    -->> ergebnis = 1;
    return ergebnis;
    }
    Rückfolgend werden nun folgende Ergebnisse geliefert.

    unsigned long fakultaet(1)
    {
    return 1;
    }
    unsigned long fakultaet(2)
    {
    return 2;
    }
    unsigned long fakultaet(3)
    {
    return 6;
    }
    unsigned long fakultaet(4)
    {
    return 24;
    }

    Ich hoffe ich konnte dir helfen... wenn nicht sag bescheid..

    [ Dieser Beitrag wurde am 05.05.2003 um 16:25 Uhr von DaDaywalker editiert. ]



  • @DaDaywalker
    Häää, warum ein riesen Zitat und keine eigene Bemerkung?
    EDIT: Au mann, und das ganze sogar 2 Mal... 🙄 *anstirnhau* 😉

    @andro
    Warum Rekursion? Es geht doch auch ohne. Dürfte sogar schneller sein...

    inline unsigned int fact(unsigned int n) {
      int ret = 1;
      for(unsigned int i = 2; i <= n; ++i)
        ret *= i;
      return ret;
    }
    

    [ Dieser Beitrag wurde am 05.05.2003 um 16:05 Uhr von MaSTaH editiert. ]



  • [QUOTE]Original erstellt von MaSTaH:
    [QB]@DaDaywalker
    Häää, warum ein riesen Zitat und keine eigene Bemerkung?
    EDIT: Au mann, und das ganze sogar 2 Mal... 🙄 *anstirnhau* 😉

    Jau Sorry das war ein fehler meinerseits. 😉

    MaSTaH: -> Häää, warum ein riesen Zitat und keine eigene Bemerkung?
    Nun das wiederrum versteh ich nicht steht da nicht genug ! ? 😃



  • Original erstellt von DaDaywalker:
    [QUOTE]Original erstellt von MaSTaH:
    [QB]MaSTaH: -> Häää, warum ein riesen Zitat und keine eigene Bemerkung?
    Nun das wiederrum versteh ich nicht steht da nicht genug ! ? 😃

    Ja, aber in deinem versehentlichen ersten Post stand nur das lange Zitat ohne Bemerkung. Dann kam das 2. Mal so ein langes Zitat. Und dann erst deine Bemerkungen...



  • danke für die infos und die for schleife ist wirklich besser, aber können soll ich die rekursive variante... 🙄



  • Achso, das ist ne Übung zur Rekursion.



  • hmm wie wärs mit:

    int faculty(int n)
    { return n==1?1:n*faculty(n-1); }
    

    ungetestet und setzt vorraus das der user korrekte werte für n angibt (>=1)...

    [ Dieser Beitrag wurde am 05.05.2003 um 20:21 Uhr von japro editiert. ]


Anmelden zum Antworten