Rekursion
-
Und wo ist jetzt Deine Frage?
-
btbtbt schrieb:
Kurze Frage zu diesem Thema von mir. Ich habe eine Funktion wie die im ersten beitrag nur ohne die letzte Zeile in der Klammer. Der Compiler meckert auch nicht wenn ich kompiliere. Er gibt aber eine Warnung das in der Funktion nicht alles einen Rückgabewert zurückgibt.
Wenn du die letzte Zeile nicht drin hast, was macht die Funktion dann?? Die gibt 1 zurück bei n==1, ansonsten macht sie gar nix?
Jedenfalls beschwert sich der Compiler zurecht. Nicht jeder Pfad gibt einen Wert zurück. Wenn n!=1, dann wird eben nix zurückgegeben. Das ist blöd, wenn doch aber irgendwo ein Wert erwartet wird...
-
_matze schrieb:
.... dann wird eben nix zurückgegeben. Das ist blöd, wenn doch aber irgendwo ein Wert erwartet wird...
Das ist aber nicht der Fall. Es wird immer etwas zurückgegeben, auch wenn die Bedingung nicht zutrifft.
Mein Compiler würde in diesem Fall einfach das n zurückgeben.
-
zurückgeber schrieb:
_matze schrieb:
.... dann wird eben nix zurückgegeben. Das ist blöd, wenn doch aber irgendwo ein Wert erwartet wird...
Das ist aber nicht der Fall. Es wird immer etwas zurückgegeben, auch wenn die Bedingung nicht zutrifft.
Mein Compiler würde in diesem Fall einfach das n zurückgeben.Es ist aber nicht definiert, was dann zurückgegeben wird... Sowas sollte man vermeiden, stimmst du mir da zu?
-
Rekursion ist eigentlich ganz einfach zu verstehen. Der OP hat hier aber offenbar noch nichtmal Funktionen verstanden. Erstmal laufen lernen, dann rennen!
zurückgeber schrieb:
Das ist aber nicht der Fall. Es wird immer etwas zurückgegeben, auch wenn die Bedingung nicht zutrifft.
Mein Compiler würde in diesem Fall einfach das n zurückgeben.Weil das n wohl gerade zufällig in dem Register liegt, dass auch für den Rückgabewert verwendet wird. Das kann ganz schnell schief gehen.
-
_matze schrieb:
Es ist aber nicht definiert, was dann zurückgegeben wird... Sowas sollte man vermeiden, stimmst du mir da zu?
jepp, so ist es.
(jepp==ja)
-
switch(enumAnswer) { case Ja: case Jepp: std::cout << "Alles klar!"; break; }
-
_matze schrieb:
std::cout "Alles klar!";
da fehlt der links-shift.
-
+fricky schrieb:
_matze schrieb:
std::cout "Alles klar!";
da fehlt der links-shift.
Klugsch...
-
Bashar ich hab die Funktionen schon vertstanden.
Was jedoch nicht ganz in meinen Kopf reingeht ist, wie sich die Funktion selber aufruft und gleichzeitig ein Rückgabewert sein kann.
Thx für die bisherigen Antworten.
-
Der Hans schrieb:
Bashar ich hab die Funktionen schon vertstanden.
Was jedoch nicht ganz in meinen Kopf reingeht ist, wie sich die Funktion selber aufruft und gleichzeitig ein Rückgabewert sein kann.
Das ist schon ein kleiner Widerspruch, aber na ja...
Deine Funktion hat einen Rückgabewert. D.h., immer wenn sie aufgerufen wird, gibt sie auch einen Wert zurück. Wenn sie sich nun selbst wieder aufruft (was bedeutet, dass da eine zweite Funktion selben Typs, eine Kopie der Funktion mit eigenen Variablen, läuft, wenn man so will), dann ändert das nichts daran, dass eine Rückgabe stattfindet. Auch wenn der Rückgabe-Wert in der "ersten" Funktion verarbeitet wird. Klar? Oder zumindest klarer?
-
Jo klarer
Betrachten wir mal die folgende Zeile (bei n = 3):return n * fak_rekursiv(n - 1);
Statt fak_rekursiv(n - 1) schreiben wir mal fak_rekursiv(2).
Das 3 - 1 = 2 ist, ist mir klar. Aber wieso bekommt die Funktion den Wert 2 damit man mit dem rechnen kann..?
-
Na du willst ja erreichen, dass bei Fakultaet(5) 5*4*3*2*1 gerechnet wird. Also rufst du beim ersten Mal n*Fakultaet(n-1) auf, also 5*Fakultaet(4). Fakultaet(4) ist 4*Fakultaet(3) usw. Am besten du schreibst dir mal Schritt für Schritt jeden Aufruf und das Ergebnis auf ein Blatt Papier, dann sollte es klar sein.
-
Der Hans schrieb:
Bashar ich hab die Funktionen schon vertstanden.
Was jedoch nicht ganz in meinen Kopf reingeht ist, wie sich die Funktion selber aufruft und gleichzeitig ein Rückgabewert sein kann.
Würdest du die fak_rekursiv-Funktion verstehen, wenn da statt fak_rekursiv ein Aufruf einer anderen Funktion (z.B. fak_iterativ) stehen würde? Was du geschrieben hast, liest sich eher so, als hättest du mit dem grundsätzlichen Konzept von Funktionen und Rückgabewerten Probleme.
-
Ja das ist mir schon klar..
Aber wieso ist:fak_rekursiv(5)
=
5?
-
Ist es doch gar nicht.
-
Bashar schrieb:
Ist es doch gar nicht.
Jetzt versteh ich gar nichts mehr..
Und wie kommt man dann zum ergebnis?
-
Bashar schrieb:
Der Hans schrieb:
Bashar ich hab die Funktionen schon vertstanden.
Was jedoch nicht ganz in meinen Kopf reingeht ist, wie sich die Funktion selber aufruft und gleichzeitig ein Rückgabewert sein kann.
Würdest du die fak_rekursiv-Funktion verstehen, wenn da statt fak_rekursiv ein Aufruf einer anderen Funktion (z.B. fak_iterativ) stehen würde? Was du geschrieben hast, liest sich eher so, als hättest du mit dem grundsätzlichen Konzept von Funktionen und Rückgabewerten Probleme.
Die Funktionen sind mir klar..
Unterprogramm starten, den neuen Wert berechnen und zurückgeben.
-
Ja, und Funktionen bzw. deren Rückgabewerte kannst du direkt in Ausdrücken verwenden. War das vielleicht noch nicht ganz klar?
int i=1+quadrat(2); //i wird 1 + die Rückgabe von quadrat (also wahrscheinlich 4) zugewiesen
-
Ich bin gerade am verzweifeln.
In der Hoffnung das ich es verstehen werde, hab ich mir ein kleines Bild gebastelt. So wie ich das verstanden habe, werden die Funktionen ineinander aufgerufen.
http://img264.imageshack.us/img264/6918/rekursion.gif
Bei "return 1;" angelangt wird immer der Rückgabewert der vorherigen Funktion gegeben oder?