Rekursion (Fakultät)



  • Hallo,
    habe vor geraumer Zeit mit dem Programmieren-Lernen begonnen.
    Bisweilen hat es alles super geklappt, jetzt häng ich aber bei der Rekursion fest.
    Aufgabe ist es, die Fakultät als Rekursion anzugeben (Buch: Prog C++ Breymann-Der C++ Programmierer - Aufgabe 3.3 (S.110)).

    #include<iostream>
    
    using namespace std;
    
    int fakultät(int zahl)
    {
    	while (zahl>1)
    	{
    		int fak = 1;
    		fak = fak * zahl;
    		zahl--;
    	}
    	return fakultät(zahl);
    }
    int main()
    {
    	int zzahl;
    	cin >> zzahl;
    	cout << endl << fakultät(zzahl) << endl;
    }
    


  • Du hast Frage oder Fehlerbeschreibung vergessen.

    EDIT:
    1. fak gibt es in der main-Funktion nicht. => Compiler-Fehler

    2. Deine Funktion ruft sich immer wieder selbst auf. Das endet in einer Endlosrekursion. Kann ja so nicht funktionieren. Denke noch mal in Ruhe über deinen Ablauf nach. 😉

    3. In der main musst du deine Variable nicht zzahl nennen. Du scheinst davon auszugehen, dass der Name zahl nur einmal im Programm vorkommen darf. Das stimmt nicht. Eine lokale Variable zahl darf natürlich in der main existieren und hat nichts mit einer lokalen Variablen zahl in einer anderen Funktion zu tun.



  • Das einzige was kommt ist:
    "Unbehandelte Ausnahme bei 0x77ad15de in Fakultät.exe: 0xC00000FD: Stack overflow."

    Mehr nicht. 😕

    EDIT: Glaube sogar, dass ich weiß, was du meinst. Ich werd mal ne Runde drüber grüebln 🙂



  • Stack Overflow kommt wegen deiner Endlosrekursion. Du rufst die Funktion immer wieder auf. Es werden immer wieder die lokalen Variablen der Funktion auf den Stack gelegt. Irgendwann isser voll. 😉 Rekursion ohne Bedingung ist halt Quatsch. Die fehlt eine Abbruchbedingung.



  • Aufgabe ist es, die Fakultät als Rekursion anzugeben

    Sorry, du berechnest die Fakultaet iterativ und rufts die Funktion rekursiv auf. Das ist nicht die Loesung.



  • Denke noch mal in Ruhe darüber nach. Es ist viel einfacher, als du dir das vielleicht vorstellst. 😉 Und lass am besten die Umlaute in Funktions- und Variablenbezeichnern weg.



  • Soweit so gut, danke für die Hilfe. 🙂

    #include<iostream>
    
    using namespace std;
    
    int fakultaet(int zahl)
    {
    	if (zahl>1)
    		return zahl * fakultaet(zahl - 1);
    	else
    		return 1;
    }
    int main()
    {
    	int zahl;
    	cin >> zahl;
    	cout << endl << fakultaet(zahl) << endl;
    }
    

    ist bei mir jetzt rausgekommen nach ein wenig hin und her probieren.
    Ergebnisse werden auch richtig zurückgegeben etc, alles wunderbar. 🙂
    Hatte grade noch die Frage warum return 1 und nicht return 0, aber hat sich von selbst erklärt 😃
    Hoffe alle sind zufrieden damit 🙂
    Kurzes Statement und/oder Verbesserungsvorschläge sind gerne gesehen. 😋

    EDIT: Umlaute sind jetz auch weg 😃



  • xStrykex schrieb:

    ist bei mir jetzt rausgekommen nach ein wenig hin und her probieren.

    Aha, du hast es also selbst gemacht.

    xStrykex schrieb:

    Hatte grade noch die Frage warum return 1 und nicht return 0, aber hat sich von selbst erklärt 😃

    Du hattest noch die Frage, warum du in deinem eigenen Code return 1 und nicht return 0 geschrieben hast? Na klar... Copy&Paste ftw! Hoch lebe das Internet! 😃



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wüsste nicht, warum ich aus dem Internet i-was kopieren sollte, wo ich es mir selber beibringen möchte und durch c&p mit Sicherheit kein großer Lernerfolg besteht 😉 zudem sind alle Lösungen im Buch vorhanden, der hat es leider nur etwas anders gemacht. 😕
    Deswegen habe ich eher etwas erwartet wie "Das ist keine Rekursion" 😃
    Mit "return 0" kam eben immer 0 bei raus, egal was geändert wurde, bei "return 1" das richtige Ergebnis, warum war logisch, wenn man es sich mal angeguckt hat (vorher nicht drüber nachgedacht).



  • Na wenn du selbst drauf gekommen bist, dann 👍 👍 👍



  • Danke 🙂
    Und danke für die Hilfe, werde jetzt wohl des Öfteren vorbeischnuppern 😃



  • Denk nochmal darüber nach, ob der Zahlen-/Werte-bereich deiner Funktion gut gewählt ist.
    (Bei 13! kommt bei aktuellen/üblichen Systemen schon Mist raus)



  • Habe es grade mit höheren Zahlen probiert und es kommen negative Ergebnisse raus, hoffe mal, dass du das meinst.
    Meine Grundgedanke dafür wäre "long" bzw "long long" zu verwenden anstatt von "int".

    EDIT: "unsigned" nicht zu vergessen 😃

    EDIT2:

    #include<iostream>
    
    using namespace std;
    
    unsigned long long fakultaet(unsigned long long zahl)
    {
    	if (zahl>1)
    		return zahl * fakultaet(zahl - 1);
    	else
    		return 1;
    }
    int main()
    {
    	unsigned long long zahl;
    	cin >> zahl;
    	cout << endl << fakultaet(zahl) << endl;
    
    	cin.get();
    }
    

Anmelden zum Antworten