[C++] Wie funktioniert das mit der fakultät berechnen?

Hi!

Irgendjemand_1 hat gesagt.:
Naja, aber wer die Fakultät von 1 ausrechnen lassen will ... ;)

Lass es mich nochmal betonen:
Die Zeile "return 1;" nach dem if Konstrukt ist absolut essenziell und darf unter keinen Umständen fehlen, denn sonst tut deine fak Funktion ganz sicher nicht das, was du willst!

Ich glaube, ich mach es nochmal ganz deutlich, indem ich für fak(4) den Programmablauf darlege:

1) if 4>1
2) return fak(3)*4
Diese Return-Zeile kann erst einmal nicht vollständig ausgeführt werden. Warum? Weil ja zunächst mal der wert von fak(3) berechnet werden muss, bevor man ihn mit 4 multiplizieren kann. Was ist also zu tun? Nun, das Programm merkt sich einfach mal den aktuellen Zustand (das geschieht mit Hilfe eines Stacks. Das macht der Compiler für dich) und ruft die Funktion fak auf, diesmal mit dem Wert 3.
3) if 3>1
4) return fak(2)*3
Schon wieder kann die Zeile nicht ausgeführt werden, denn erstmal muss fak(2) berechnet werden. Also wieder den aktuellen Zustand merken und weiter:
5) if 2>1
6) return fak(1)*2
Und auch diese Zeile kann nicht direkt ausgeführt werden, bevor nicht der Wert von fak(1) ermittelt ist.
7) if 1>1
8) return 1
Aber jetzt! Endlich mal ne Zeile, die simpel ist! Die kann direkt und vollständig ausgeführt werden. Return heißt ja nix anderes als "zurückkehren" bzw. "zurückgeben". Beides trifft ja zu:
"return x;" bewirkt, dass zu einem vorigen Zwischenzustand zurückgekehrt wird und dabei der Wert x an den Zwischenzustand zurückgegeben wird.
Genau das passiert jetzt. Zeile 8 liefert eine 1 an den Zwischenzustand von Zeile 6 zurück. Damit ist Zeile 6 endlich vollständig ausführbar:
return 1*2;
Dieses return kehrt jetzt zum Zwischenzustand von Zeile 4 und liefert 1*2=2. Jetzt kann auch diese Zeile ausgeführt werden:
return 2*3;
Das kehrt jetzt zurück zu Zeile.... na, ich denke, es ist klar, wie es weitergeht.

Jetzt sollte auch klar sein, warum das "return 1;" so essentiell ist! Schau dir deinen Code nochmal an. Was passiert denn, wenn die if-Bedingung unwahr wird? Dann wird die Funktion beendet, ohne eine "return" gemacht zu haben. Der Compiler macht eine automatisches "return". Aber mit welchem Wert ...

So, ab jetzt sind Rekursionen kein Thema mehr, oder? ;-)

Cheers, Ingo =;->
 
Hi, mir war langweilig. Ich hab dir mal n Programm für die Fakultät geschrieben:

Code:
#include <iostream.h>
#include <conio.h>

int main()
{
cout << "Geben Sie eine Zahl ein: ";
int Zahl;
cin >> Zahl;
int x = Zahl-1;
int Res = Zahl;
  while (x > 1)
  {
  cout << Res << " * " << x << " = " << Res * x << endl;
  Res *= x;
  x--;
  }  
cout << "Die Fakultaet von " << Zahl << " ist: " << Res;
getch();
return 0;    
}
 

Neue Beiträge

Zurück