Eine Fakultätentabelle von 1! bis n! wie mache ich das?



  • ne sind sie nicht...und die meisten funktionalen sprachen unterstüzen auch diverse schleifen konstrukte *g*, die leute halten rekursiv einfach für schöner...es ist ja auch praktisch du kannst zb. eine mathematisch rekursiv definierte funktion gleich so hinschreiben wie du sie vor dir hast...ob das effizient ist is eine andere frage.

    Meines erachtens ist eine Rekursion in funktionalen Programmiersprachen effizienter und mächtiger.

    Aber was sollen jetzt die Verfechter der Funktionalen Programmierung sagen? Bei denen gibts kine Schleifen. Die machen alles rekursiv. Sind die jetzt alle blöd?

    Was mir aufgefallen ist, das viele Menschen die iterativ progr., Probleme haben Rekursiv zu denken. Da sie immer den Programmablauf beschreiben wollen und net das Ergebnis.
    Ist schon lustig, seine schleifenbedingte Denkweise übern Haufen zu werfen.



  • PeterTheMaster schrieb:

    und auch nicht vergessen, dass alle zwischenergebnisse auszugeben sind. es waere krass dumm, jede zeile neu zu berechnen. es ist immer sehr drollig, neulinge, die irgendwo eine rekursive funktion abgeschrieben (und natuerlich nicht verstanden) haben, dabei zu beobachten, irgendwas daran aendern zu wollen. wann ist es aufsteigend? wann ist es absteigend? trial und error pur.

    ich versteh kein wort 😕

    #include <iostream>
    using namespace std;
    int Fak(int Zahl) {  
       if(Zahl == 1)    
         return 1; 
       return Zahl * Fak(Zahl-1); 
    }
    
    int main() {
       int max_Fak = 4;
       for(int i = 1;i <= max_Fak; ++i)         
          cout<<i<<"! = "<<Fak(i)<<endl;
    return 0;
    }
    

    wie jede zeile neu berechnen, natürlich jede zeile neu berechnen(!)...
    aufsteigend, absteigend... hä?



  • Jeder Funktionsaufruf wird auf dem Stack abgelegt. Bei einer rekursiven Funktion
    wird also immer wieder die Funktion auf dem Stack abgelegt, was diesen füllt.
    Dies verbraucht Zeit und Speicherplatz.
    Darum sind rekursiven immer die iterativen ( ) vorzuziehen.

    Das was du beschrieben hast ist nicht häßlich. Häßlich wäre für mich was optisches, sozusagen das der Code bei einer Rekursion unlesbar wäre, oder in der Art. Aber das ist ja nicht der Fall. Rekursion ist eigentl. was schönes.

    Muss dir aber Recht geben, Rekursion ist größtenteils für funtionale P-Sprachen ausgérichtet.



  • Was mir aufgefallen ist, das viele Menschen die iterativ progr., Probleme haben Rekursiv zu denken. Da sie immer den Programmablauf beschreiben wollen und net das Ergebnis.
    Ist schon lustig, seine schleifenbedingte Denkweise übern Haufen zu werfen.

    als für mich sind rekursive funktionen auch nix anderes wie schleifen :p 🙂



  • @RPD: ich weis nicht ob man diese loesung als rekursiv bezeichnen kann, aber hier sieht man das fuer jeden tabellen eintrag nur eine multiplikation notwending ist, wenn man jedesmal wieder eine rekursive funktion aufruft dann sind jedesmal wieder i multiplikationen und i funktionsaufrufe notwendig.

    orginal siehe erste seite

    const int n=4; 
    int fakultaet[n]; 
    fakultaeten[0] = 1; 
    
    for (int i=1; i<n; ++i) { 
       fakultaet[i] = fakultaet[i-1] * i; 
    }
    


  • Anonymous schrieb:

    Das was du beschrieben hast ist nicht häßlich. Häßlich wäre für mich was optisches, sozusagen das der Code bei einer Rekursion unlesbar wäre, oder in der Art. Aber das ist ja nicht der Fall. Rekursion ist eigentl. was schönes.

    schoen muss nicht immer etwas optisches sein, man kann auch algorythmen, die effizient sind, als schoen bezeichnen. und die rekursion ist nun mal nicht performant.



  • @Mirauder_Mo
    is schon klar. aber das is keine rekursive funktion ⚠



  • loesung als rekursiv

    Na klar ist sie rekursiv? Was denkst du, was Rekursion ist?

    Zw. rekursive Funktionen und Rekursion gibts noch einen kleinen Unterschied!
    Also ich kann nur sagen das ich am ANfang meine Probleme hatte , da ich alles mit Schleifen beschreiben wollte, aber mit der Zeit legt sich das.
    Es ist aber falsch Rekursion und Schleife gleich zusetzen.

    Rekursion -> Was ist das Ziel?
    Schleife -> Wie komme ich zum Ziel?

    Bsp. Parsergenerierung
    Wenn ich ne LL(1) Grammatik habe und einen Recursive Descent Parser definiere, sollte man wirklich nicht mehr iterativ denken, da das die Sache total verkompliziert.



  • /*
      Wenn's unbedingt rekursiv sein muß ;)
      aber normal würde man das nicht machen.
    */
    unsigned print_factorial_table(unsigned n) {
      if (n == 0) {
        return 1;
      } else {
        unsigned result = n * print_factorial_table(n-1);
        cout << result << endl;
        return result;
      }
    }
    


  • hab mich vertippt, siehe edit, lass mir doch drei minuten...bin ja auch grad beim arbeiten...

    btw.: für mich sind rekusionen schleifen! punkt und basta 😃



  • Bashar schrieb:

    /*
    aber normal würde man das nicht machen.
    */

    das hoff ich doch 😉



  • rpd: Schemer? 😉



  • ich? nein! 😃 erlaubt ist was gefällt... 😉



  • void fak_tabelle(unsigned int max_fak) {
      unsigned int f = 1;
      for (unsigned int i = 1;i<max_fak;++i) {
        f *= i;
        cout << f << endl;
      }
    }
    

    so gehts auch ohne array



  • Anonymous schrieb:

    so gehts auch ohne array

    Klar, aber war nicht explizit nach einer tabelle gefragt ?



  • Mirauder_Mo schrieb:

    Anonymous schrieb:

    so gehts auch ohne array

    Klar, aber war nicht explizit nach einer tabelle gefragt ?

    Naja, die Tabelle kann ja auch nur ausgegeben werden... wer verlangt denn ein Array?



  • Anonymous schrieb:

    Rekursive Funktionen find ich hässlich

    Was ist bitte daran hässlich?

    Warum 'ne rekursive Funktion ich würd für so 'ne kleine anweisung sowieso 'ne while Schleife nehmen.

    P.S. noobs würd ich auch keine rekursiven Funktionen empfehlen, aber sie können trotzdem manchmal sehr nützlich sein.



  • RPD: man sieht, dass du nicht verstehst. kuck dir mal den unterschied zwischen deiner und bashars loesung an.



  • jo, hab doch gesagt das ich nix verstanden hab...
    außerdem kannst du mir glauben das ich nicht auf bashars beitrag geantwortet hätte ohne ihn zu lesen 😃
    kuckst du hier:

    aber normal würde man das nicht machen.


Anmelden zum Antworten