Fakultätsoperator für ein Programm?
-
TheQ schrieb:
Bashar schrieb:
TheQ schrieb:
kurz und knapp:
int fak(int n) { return (n<2) ? n : n * fak(n-1); }rekursive definition und sehr kurz geschrieben

und falsch.
wo denn?
Gib mal 0 ein.
-
ok, mal laut wikipedia die definition angeschaut und verbessert.
int fak(int n) { return (n==0) ? 1 : n * fak(n-1); }
-
sieht richtig aus.
-
Ist aber immer noch ziemlich lahm. Für Fakultäten gibt es keinen guten Grund zur Rekursion zu greifen. Schließlich gibt es keinerlei Verzweigungen im Ablauf.
-
Bei dir kann man -1 eingeben und das Resultat ist sicher komisch.
Deshalb:// 1. Variante unsigned fak(unsigned n) { return n?n*fak(n-1):1; } // 2. Variante int fak(int n) { return n<2?1:n*fak(n-1); } // 1 bei -1 ist zwar komisch, aber verständlich
-
Des halb habe ich auch aus Performancegründen zum TMP gegriffen ^^
-
Ja sicher, TMP: überhaupt nicht rekursiv und sehr schnell und praxisbezogen:
int i; std::cin >> i; std::cout << fakultaet<i>() << std::endl;Da verwende ich doch lieber Boost, weil für vordefinierte Werte Fakultäten vom Compiler berechnen zu lassen ist doch eher unüblich (und ausserdem musst du die Funktion sehr oft aufrufen, um die dafür zusätzlich benötigte Compilezeit wieder reinzuholen).
-
int fak(unsigned n) { unsigned result=1; for (unsigned i=1; i<=n; ++n) result*=i; return result; }Sieht zwar weniger schick aus, aber lasst das mal gegen die Rekursionsfunktion rennen.
edit: <= natürlich. Alte Gewohnheit

-
SeppJ schrieb:
int fak(unsigned n) { unsigned result=1; for (unsigned i=1; i<=n; ++n) result*=i; return result; }Sieht zwar weniger schick aus, aber lasst das mal gegen die Rekursionsfunktion rennen.
edit: <= natürlich. Alte Gewohnheit

Ist aber immernoch falsch

-
hmmmmm,..
x>(2^13) kommt doch so oder so ein überlauf,... da beschwer ich mich doch nicht über die performance,... geschweige das das double noch net mal darstellen kann,..
greetz
-
HighLigerBiMBam schrieb:
Ist aber immernoch falsch

template<typename Type> Type Facul(Type x) { if(x<0) return 0; Type f=1; while(x>1) f*=x--; return(f); }So kann's aussehen. Von rekursiven Aufrufen kann ich nur abraten, bei solchen Spielfunktonen noch akzeptabel, ist bei einigen anderen Algorithmen wie z.B. Floodfill nicht angebracht.
-
Nochmals danke an alle für eure Hilfe, ohne eure Hilfe hätte ich das nie lösen können.
