myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   Fakultät C++ (https://mygully.com/showthread.php?t=3180841)

Iliaz 26.01.14 21:48

Fakultät C++
 
Mag mir jemand bitte erklären was an folgenden Stellen geschieht und der Code ganz genau beschreibt bzw. macht? Ich habe die entsprechenden Stellen markiert. Es geht um die Berechnung der Fakultät und ich stecke in diesem Bereich fest. Ich erfreue mich über jede hilfreiche Antwort.


#include <iostream>
using namespace std;

int fakultaet(int zahl) {
if (zahl <= 1) { // Falls zahl kleiner gleich 1
return 1; // Hier
}

return fakultaet(zahl - 1) * zahl; // Hier
}

int main() {

int zahl;

cout << "Bitte Zahl eingeben: ";
cin >> zahl;
cout << "Die Fakultät von " << zahl << " ist " << fakultaet(zahl) << " !";

cin.sync();
cin.get();
return 0;
}

spartan-b292 26.01.14 23:33

Das nennt sich Rekursion. Nimm dir Zettel und Stift und schreib dir auf was an die Funktion übergeben wird und was die Rückgabewerte sind.

Odatas 27.01.14 08:59

Wie schon gesagt ist das Rekursion. Die Funktion Fakultät schaut nach ob die Zahl die du reinsteckst eine 1 ist. Ist sie eine 1 gibt sie die Zahl zurück. Ist sie Größer als 1 wird die das Produkt gebildet mit der Zahl um einen inkrementiert (Schlaue Leute ausdruck für heruntergezählt) welche nochmal an die Funktion gegeben wird und das ganze Spiel geht von vorne los. Und das so oft bis die zahl bei 1 ist.

spartan-b292 27.01.14 10:47

[QUOTE=Odatas;25255642. Ist sie Größer als 1 wird die das Produkt gebildet mit der Zahl um einen inkrementiert (Schlaue Leute ausdruck für heruntergezählt)[/QUOTE]

Runterzählen: Dekrementieren
Hochzählen: Inkrementieren

cortez442 27.01.14 20:43

Ist halt aufgebaut, wie eine rekursive Funktion aufgebaut werden muss. Man hat eine Abbruchbedingung und einen rekursiven Pfad. Der Abbruchpfad ist offensichtlich Zahl <=1. Bleibt also noch zu klären, wozu der rekursive Pfad führt. Die Funktion ruft sich solange mit dem der um 1 dekrementierten Zahl selber auf, bis die Zahl am Ende 1 ist (Sollte der Startwert <= 1 sein, tritt natürlich die Abbruchbedingung in Kraft und 1 ausgegeben).

Am Ende hast du einen Rattenschwanz von rekursiven Aufrufen in deinem Stack, der rückwärts wieder abgearbeitet wird. Der letzte Aufruf (bzw. der, der als erstes abgearbeitet wird) gibt dir 1 zurück. Dieser Wert wird an die aufrufende Instanz übergeben und mit dem Wert multipliziert (in den Fall die 2). Also haben wir 2! = 2. Dieser Wert wird abermals an die vorherige Instanz übergeben und mit der Zahl multipliziert. Also haben wir die 2 als Rückgabe der eben aufgelösten Instanz, welche mit der 3 multipliziert wird. 2 * 3 = 3! = 6. Das geht dann so weiter, bis die Funktion abgearbeitet ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:36 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.