kleines Anfängerproblem

T

Thomas_xp

Aktives Mitglied
Thread Starter
Dabei seit
05.04.2006
Beiträge
632
Reaktionspunkte
13
Hallo. Kann mir jemand den Fehler in diesem Programm erklären?
-------------------------------------------------------------
#include <stdio.h>

float fakultaet(int n)
{
float fak = 1.0;
if(n == 1)return;
printf( "Fakultaet von %d = %f\n", n, fak ) ;
fak = n * fakultaet(n-1);
printf( "Fakultaet von %d = %f\n", n, fak ) ;
return fak ;
}


int main()
{
int n;
printf("Geben sie eine Zahl ein\n");
scanf("%d", &n);
fakultaet((int)n);
}
---------------------------------------------
Wenn ich nur int Variablen benutze funktioniert es. Wenn ich doubles oder floats verwende wir beim letzten rekursiven Aufruf "fak" 0 anstatt 1(und dann 2,6,24,120....) zu werden. Wieso???? mit int Variablen funktioniert es ja.
 
Zuletzt bearbeitet:
Poste doch mal den Code, der NICHT funktioniert.

Der, der hier steht soll ja funktionieren wenn ich Dich richtig verstanden hab

Alex
 
Hallo. Kann mir jemand den Fehler in diesem Programm erklären?
-------------------------------------------------------------
#include <stdio.h>

float fakultaet(int n)
{
float fak = 1.0;
if(n == 1)return;
printf( "Fakultaet von %d = %f\n", n, fak ) ;
fak = n * fakultaet(n-1);
printf( "Fakultaet von %d = %f\n", n, fak ) ;
return fak ;
}


int main()
{
int n;
printf("Geben sie eine Zahl ein\n");
scanf("%d", &n);
fakultaet((int)n);
}
---------------------------------------------
Wenn ich nur int Variablen benutze funktioniert es. Wenn ich doubles oder floats verwende wir beim letzten rekursiven Aufruf "fak" 0 anstatt 1(und dann 2,6,24,120....) zu werden. Wieso???? mit int Variablen funktioniert es ja.

Ich bin mir im moment nicht sicher, aber wahrscheinlich liegt es an: fak = n * fakultaet(n-1);
Afaik wird da der float fakultaet(n-1) in nen int gecastet, weil mit nem int multipliziert wird.
Du müsstest also das n zu nem float casten.
 
Ich frage mich, warum du überhaupt float oder double benutzt. Das macht eigentlich keinen Sinn. Die Fakultät einer natürlichen Zahl ist ebenfalls eine natürlich Zahl.

Dein Problem liegt wohl daran an dieser Zeile

Code:
if(n == 1)return;

Da gibst du wohl implizit 0 zurück. Also mit

Code:
if(n == 1)return 1;

funktioniert es bei mir.
 
Danke für eure Antworten.

1) Unter anderem ist dies für einen Übungsaufgabe an der UNI. Ich habe diese zwar Iteration (mit einer einfachen for-Schleife) gelöst, was auch weniger Systemresourcen fordert, wollte aber auch die Rekursion ausprobieren.
2) In der Aufgabe wurde double als Typ verlangt, um größere Zahlen zeigen zu können. Mit int ist recht früh Schluss, mit float meine ich waren es 34! und mit double 171!.
3) Das mit dem int n, also n als float oder double zu deklarieren, hatte ich auch versucht, brachte aber nix.
4) Das mit dem return 1 werd ich gleich mal versuchen. Ich hoffe mal das klappt.
 
4) Das mit dem return 1 werd ich gleich mal versuchen. Ich hoffe mal das klappt.

Mich wundert es, dass du es so überhaupt kompiliert bekommen hast. Xcode meldet mir einen Fehler. Schließlich ist der Rückgabewert float und nicht void. Somit musst du eigentlich auch einen float zurückgeben.

Was ich noch ein wenig unglücklich finde, ist die Ausgabe:

Code:
Geben sie eine Zahl ein
3
Fakultaet von 3 = 1.000000
Fakultaet von 2 = 1.000000
Fakultaet von 2 = 2.000000
Fakultaet von 3 = 6.000000

Fakultät has exited with status 0.

Da stimmen ja nur die letzten beiden Zeilen. Du solltest vielleicht Zwischenergebnisse auch entsprechend kennzeichnen.
 
Zurück
Oben Unten