templatefunktion Binominalkoeffient
-
Hallo Leute,
kann mir hier vielleicht einer weiter helfen? Und zwar soll ich eine Templategeschichte machen die einen binominalkoeffizieten berechnet. Meine Rechnung stimmt nur habe ich noch Probleme mit dem Code. Mit der Übergabe der Parameter hackt es sehr. Oder ist der Fehler ganz woanders? Könnte mir irgend jemand hier vielleicht meine Fehler ausbügeln?:edit
Aufgabenstellung
Die Fakultät ist als Rekursive Templatefunktion mit einem Template Parameter vom Typ int implementiert. Der Binominalkoeffizient ist implementiert als Template Funktion mit zwei Template Parametern vom Typ int und verwendet die Template Funktion zur Berechnung der Fakultät.#include <iostream> #include <iomanip> //make available setprecision() using namespace std; //Funktions-Template mit Ganzzahlparameter k template <int z> int f() //Ursruenglich stand da double f() //Fuer jeden Wert k wird, falls notwendig, eine eigene //Funktion ausgepraegt { return z*f<z-1>(); } template<> int f<0>() //Spezialisierung fuer int-Wert k=0 { return 1; } //Funktions-Template um Binomkof zu berechnen template<int a, int b> int binom(){ return( f<a>() / ( f<b>() * f<a-b>()) ); } int main() { int n,k; cout<<"Geben sie n ein"<<endl; cin>>n; cout<<"Geben sie k ein"<<endl; cin>>k; cout<< binom(n,k) <<endl; return 0; }
-
so get geht das nicht, non-type template parameter müssen konstante ausdrücke sein, also kannst du sie nicht erst zur laufzeit abfragen. wenn die aufgabe tatsächlich so gestellt wurde ist sicher auch nicht nach einem ganzen program gefragt, sondern nach einem klassen template mit einem spezillen member, das das funktionsergebnis enthält
template<int n, int k> struct Binomialkoeffizient { static const int value = // ... was hier kommt, sollst du dir überlegen };damit das funktioniert, musst das template noch für gewisse fälle (partiell) spezialisieren um endlos-rekursion zu vermeiden.
-
wlive schrieb:
Hallo Leute,
kann mir hier vielleicht einer weiter helfen? Und zwar soll ich eine Templategeschichte machen die einen binominalkoeffizieten berechnet. Meine Rechnung stimmt nur habe ich noch Probleme mit dem Code. Mit der Übergabe der Parameter hackt es sehr. Oder ist der Fehler ganz woanders? Könnte mir irgend jemand hier vielleicht meine Fehler ausbügeln?camper hat's schon gesagt ...
Templates werden immer zur Compile-Zeit aufgelöst. D.h. alle Ergebnisse (z.B. Fakultät) die mit Template-Technicken berechnet werden sind nach dem Compilieren berechnet, also bevor Du Dein Programm laufen lassen kannst.
Also kannst Du nur schreiben:int main() { using namespace std; cout << binom< 5, 3 >() << endl; return 0; }wo dann auch das korrekte Ergebnis (hier 10) erscheint.
'ne Alternative dazu wäre übrigens
template< int N, int K > struct Binom { enum { value = Binom< N - 1, K - 1 >::value + Binom< N - 1, K >::value }; }; template< int N > struct Binom< N, 0 > { enum { value = 1 }; }; template< int N > struct Binom< N, N > { enum { value = 1 }; }; int main() { using namespace std; cout << Binom< 5, 3 >::value << endl; return 0; }dann vermeidet man die hohen Werte der Fakultäten, dafür wird der Compiler mehr gefordert.
Gruß
Werner
-
wobei der enum hack nicht unbedingt schön ist und eigentlich nur bei alten und kaputten compilern gebraucht wird. übrigens fehlt noch eine explizite spezialisierung für <0,0>.