Forum: PC-Programmierung e rekursive berechnen


von Lena (Gast)


Lesenswert?

Hallo Zusammen.

Ich brauche zur Prüfungsvorbereitung ein c+ Programm, dass e rekursive 
berechnet.
Bis jetzt habe ich:

double e_rek (int n)
{
  if(n ==1)
  {return 1;}
  else{  return (e_rek(n) + 1.0/fak(n));}
}

die Funktion fak(n) berechnet die Fakultät von n. Sie funktioniert.
Aber für e kommt immer das falsche heraus. :-(

Ich hoffe ihr könnt mir helfen.
Lena

von tex (Gast)


Lesenswert?

reden wir von der Eulerzahl?

von Lena (Gast)


Lesenswert?

ja genau.

von tex (Gast)


Lesenswert?

Na dann wirst Du sie wohl etwas auflösen müssen, damit C etwas damit 
anfangen kann. Immerhin steckt da so eine Art While-Schleife in der 
Formel

http://de.wikipedia.org/wiki/Eulersche_Zahl

PS.
Dozentin: Frau Kothe?

von Lena (Gast)


Lesenswert?

Hi
Auf der Seite war ich schon.
Ich habe je versucht, die Reihenformel in C umzusetzen.
Das dumme ist nur, dass mein Prof. die Lösung gerne rekursive haben 
möchte.
Und leider funktioniert mein Programm nicht.

int fak(int n)
{
if (n == 0 || n == 1)
return 1;
return (fak(n-1)*n);
}

  double e_rek (int n)
{
  //return ( rekursivBiKo((n-1),k)+ rekursivBiKo ((n-1),(k-1)));
  if(n ==1)
  {return 1;}
  else{  return (e_rek(n) + 1.0/fak(n));}
}

Brauche echt Hife, morgen ist die Klausur. :-(

von tex (Gast)


Lesenswert?

??
Ich komme noch nicht ganz darauf was Du meinst.
In der Regl ist es so dass die Eulerzahl anhand einer Reihe berechnet 
wird. Wenn Ich Deinen Ansatz richtig deute sollst Du die Euler-Zahl bis 
zur n-ten Reihe berechnen, also er gibt n= 5 vor und dann wird eben 
aufsummiert bis 1/5!
Habe ich das richtig verstanden?

von PR (Gast)


Lesenswert?

Wo wird denn in der Funktion double e_rek dein n verändert???

von Lena (Gast)


Lesenswert?

Ja richtig. Wir sollen es als Reihe entwickeln.
Nur diese Entwicklung soll halt rekursive sein. Sprich die Funktion zur 
Berechnung ruft sich immer wieder selber auf.

von tex (Gast)


Lesenswert?

<< Sprich die Funktion zur
Berechnung ruft sich immer wieder selber auf. >>
Nun gut. Das ist überschaubar und macht Sinn
Die Anzahl der Aufrufe wird vorgegeben == n
Dann beginnst Du eine Schleife die von 1 an die Variable y hochzählt, 
bis n erreicht ist.
Und y dient Dir gleich für die Fakultät also     temp = fak(y).
Das Ergbenis in seinen Kerwehrt wandeln    ergebnis = 1/temp.
und dann der Eulerzahl, die in der Initialisierung mit 1 geladen wurde
int Eulerzahl = 1;
hinzuaddieren  Eulerzahl = Eulerzahl + ergebnis;
Die Schleife ist zu ende, wenn y == n ist.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Sie soll es doch rekursiv machen, also keine Schleife. Ist in C 
natürlich nur zu akademischen zwecken sinnvoll, aber naja.

> else{  return (e_rek(n) + 1.0/fak(n));}

Müsste e_rek(n-1) heißen, sonst bekommst du Endlosrekursion.

von Lena (Gast)


Lesenswert?

Danke erstmal für eure Hilfe.
Leider klappt es immer noch nicht
Mein Code sieht nun so aus:

int fak(int n)
{
if (n == 0 || n == 1)
return 1;
return (fak(n-1)*n);
}

  double e_rek (int n)
{
  if(n ==1)
  {return 1;}
  else{  return (e_rek(n-1) + 1.0/fak(n));}
}

es gibt zwar keine Fehler mehr, aber das Ergebnis ist sehr weit von e 
entfernt

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Du vergisst das 1/1 in der Reihe:

Ändere if(n ==1) zu if(n == 0), dann passt's.

von Lena (Gast)


Lesenswert?

Danke ihr seid super. :-)

von Uhu (Gast)


Lesenswert?

Richtig schön anspruchsvoll ist es, den Nenner als doppelte Rekursion 
zwischenzuspeichern, sodaß man nicht immer den Nenner neu berechnen 
muss, sondern nur den neuen Teiler hinzumultipliziert. Das Ding läuft 
als pipeline in Form eines Testprogrammes auf einem Altera FPGA. Ist 
sauschnellt und rechnet in Windeseile auf X-Stellen herunter.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Das Ganze als rekursive Funktion zu schreiben ist von hinten durch die 
Brust ins Auge; bei der iterativen Realisierung ist es sofort 
offensichtlich wie man sich die Nennerberechnung erleichtern kann.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.