Frage zum Programm
-
Hallo ich habe folgende Frage zum Programm aus einem Buch:
Hier erstmal das Mini-Programm:#include <stdio.h>
float funk (int zahl);
void main ()
{
int i;
printf ("\n Eingabe");
scanf ("%d", &i);
printf ("\n \n Ausgabe(%d) = %f",i,funk(i));
}
float funk (int zahl)
{
float erg=0.0;
if (zahl>0)
erg=zahl+funk(zahl/3) / funk(zahl-1);
else erg=1.0;
return(erg);
}Ich komm nicht ganz drauf wie sich das Ergebniss "erg" ausrechnen lässt.Somit kann ich das Programm nicht ganz nachvollziehen.. Kann mir jemand vlt helfen und sagen wie das Ergebniss ausgerechnet wird?
LG
Gast
-
Sowas nennt sich "Rekursion":
float funk (int zahl) { float erg=0.0; if (zahl>0) erg=zahl+funk(zahl/3) / funk(zahl-1); else erg=1.0; return(erg); }
Wenn die übergebene Zahl größer als Null ist, werden zwei weitere Aufrufe von funk() gestartet und deren Rückgabewerte verrechnet, andernfalls wird 1 geliefert:
funk(5) = 5 + funk(1) / funk(4) = 5 + (1+funk(0)/funk(0)) / (4+func(1)/funk(3)) = 5 + (1+1/1) / (4+(1+funk(0)/funk(0))/(3+funk(1)/funk(2)) = ...
-
DAnke für die schnelle Antwort. Zwei Fragen habe ich jedoch noch:(
Wird das Programm mit Hilfe des Rückgabewertes Return(erg) terminiert?So ganz habe ich die Rechnung:
funk(5)
= 5 + funk(1) / funk(4)
= 5 + (1+funk(0)/funk(0)) / (4+func(1)/funk(3))
= 5 + (1+1/1) / (4+(1+funk(0)/funk(0))/(3+funk(1)/funk(2))
= ...nicht verstanden:(
Was bekomme ich denn dann für den Eingabewert "5" raus?
Könntest du das für mich bitte noch eben vervollständigen, damit ich das System überblicken kann?Lg
mel
-
Als das mit dem Return(erg) besagt nichts weiter als die Funktion beendet wird.
Aaaber,kann mir jemand den Funktionabschnitt
erg=zahl+funk(zahl/3) / funk(zahl-1);erklären? Wenn ich z.B. die Zahl 5 eingebe bekomme ich den Wert
5,441861 raus. Aber wie kommt das Programm auf diesen Wert?
Ich komme rechnerisch einfach nicht auf die Lösung:(Und leider hat mir
funk(5)
= 5 + funk(1) / funk(4)
= 5 + (1+funk(0)/funk(0)) / (4+func(1)/funk(3))
= 5 + (1+1/1) / (4+(1+funk(0)/funk(0))/(3+funk(1)/funk(2))
auch noch nicht so ganz geholfen..
Ist sicher etwas komplizierter aber um weiter zukommen will ich das Programm
ein wenig durchschaut haben:-)Hoffe mir kann noch jemand helfen
lg Mel
-
OK, dann nochmal etwas langsamer: Wenn du funk(5) aufrufst, ruft die Funktion sich zunächst selber rekursiv mit den Werten 1 (5/1 - Ganzzahldivision) und 4 (5-1) auf und setzt die beiden Rückgabewerte in die Rechenvorschrift ein. Das dabei ermittelte Ergebins wird anschließend zurückgegeben:
funk(5) funk(1) funk(0) // 1/3 return 1 // Rekursionsabbruch funk(0) //1-1 return 1 return 1+1/1==2 func(4) funk(1) // 4/1 ... return 2 funk(3) // 4-1 funk(1) // 3/3 ... return 2 funk(2) // 3-1 funk(0) //2/3 return 1 funk(1) //2-1 ... return 2 return 2+1/2==2.5 return 3+2/2.5==3.8 return 4+2/3.8==4.526 return 5+2/4.526==5.441
(So, jetzt habe ich mal versucht, alle rekursiven Aufrufe der Funktion vernünftig zu schachteln - hoffe es hilft)
-
Achso, jetzt habe ich das verstanden.
Vielen lieben Danklg Mel