mikrocontroller.net

Forum: PC-Programmierung e rekursive berechnen


Autor: Lena (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
reden wir von der Eulerzahl?

Autor: Lena (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja genau.

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lena (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-(

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: PR (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo wird denn in der Funktion double e_rek dein n verändert???

Autor: Lena (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lena (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du vergisst das 1/1 in der Reihe:

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

Autor: Lena (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke ihr seid super. :-)

Autor: Uhu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.