Forum: PC-Programmierung Eulersche Zahl rekursiv


von Albert (Gast)


Lesenswert?

#include<iostream>
using namespace std;

Hallo liebe Informatikergemeinde :-)
Versuch grad ein Programm mit C++ zu schreiben, das die eulersche Zahl 
rekursiv berechnet. Leider wird mir überhaupt kein Ergebnis ausgespuckt. 
Sieht jemand den Fehler?
1
double fac(int n) {
2
  if(n=0)
3
    return 1;
4
  else
5
    return fac(n-1)*n;
6
}
7
8
double euler(int n) {
9
  if(n=0)
10
    return 1;
11
    else
12
    return (euler(n-1)+(1/fac(n)));
13
}
14
15
int main()
16
{
17
  int n;
18
  cout << "Gib n ein!" << endl;
19
  cin >> n;
20
  cout << euler(n) << endl;
21
}
LG

: Bearbeitet durch User
von M.N. (Gast)


Lesenswert?

if(n=0)
Guck noch mal genau hin!

von Nico S. (longri)


Lesenswert?

versuche es mal mit
1
if(n==0)

von Nico S. (longri)


Lesenswert?

Mit einem "=" führst du eine Zuweisung durch die (fast) immer wahr ist, 
mit "==" wird ein Vergleich daraus

von Tom (Gast)


Lesenswert?

Du hast die Compilerwarnungen nicht empfindlich genug eingestellt.
Z.B. -Wall -Wextra bei gcc, dann alle Warnungen verstehen und 
abarbeiten.

von Albert (Gast)


Lesenswert?

Super, jetzt funktioniert's. Danke!

von Herbschi (Gast)


Lesenswert?

Abgesehen von dem "=="-Fehler, der ja schon aufgezeigt wurde, ist das 
Programm in Bezug auf Datentypen eine reine "Konvertierungskatastrophe". 
Auf einem PC (wo es ja schließlich eine FPU gibt), ist es wesentlich 
effizienter, sich die ständige Umwandlung zwischen int und double zu 
sparen und nur mit double zu arbeiten. Um das Problem der Identitäten 
von double-Zahlen zu umgehen, kann man "if (n < 1.0)..." schreiben:
1
#include <iostream>
2
3
using namespace std;
4
5
double fac(double n) {
6
    if(n < 1.0)
7
        return 1.0;
8
    else
9
        return fac(n - 1.0) * n;
10
}
11
12
double euler(double n) {
13
    if(n < 1.0)
14
        return 1.0;
15
    else
16
        return (euler(n - 1.0) + (1.0 / fac(n)));
17
}
18
19
int main()
20
{
21
    double n;
22
    cout << "Gib n ein!" << endl;
23
    cin >> n;
24
    cout << euler(n) << endl;
25
}

Herbschi

: Bearbeitet durch User
von Programmierer (Gast)


Lesenswert?

Nico S. schrieb:
> Mit einem "=" führst du eine Zuweisung durch die (fast) immer wahr
> ist,
> mit "==" wird ein Vergleich daraus

Wenn man keine Ahnung hat, einfach mal die Fresse halten. Die Zuweisung
(n=0) wird IMMER als falsch gewertet und nicht (fast) immer wahr.

von Dirk B. (dirkb2)


Lesenswert?

Programmierer schrieb:
> Die Zuweisung
> (n=0) wird IMMER als falsch gewertet und nicht (fast) immer wahr.

1. Von n=0 hat Nico nichts geschrieben.
2. ist 0 der einzige Fall, wo die Zuweisung false ergibt.

Darum ist die Aussage "Mit einem "=" führst du eine Zuweisung durch die 
(fast) immer wahr ist" absolut korrekt.

Also beherzige deine eigene Aussage.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dirk B. schrieb:
> 1. Von n=0 hat Nico nichts geschrieben.
Es ging aber um die Abfrage, die Albert schrieb:
> if(n=0)
Worauf Nico S. schrieb:
> Mit einem "=" führst du eine Zuweisung durch die (fast) immer wahr ist
Aber eben immer genau dann nicht, wenn eine 0 zugewiesen wird.

Könnte natürlich auch ein wenig Ironie oder Sarkasmus in dieser Aussage 
gewesen sein, das ist schwer zu erkennen...

In der finalen Summe gilt, was Albert schrieb:
> Super, jetzt funktioniert's. Danke!

: Bearbeitet durch Moderator
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.