Update: Dieser ist wie in der Schule am Samstag ...
#include <iostream>
#include <unordered_map>
int& factorial(int n) {
static std::unordered_map<int,int> memo = {{0,1},{1,1}};
if(!memo.count(n)) {
memo[n] = n * factorial(n-1);
}
return memo[n];
}
int main() {
using std::cout;
cout << factorial(1) << '\n';
cout << factorial(5) << '\n';
cout << " ----\n";
factorial(1) = 123456789; // make factorial(1) better
cout << factorial(1) << '\n';
cout << factorial(5) << '\n'; // factorial(5) is still 120
// because its value was saved
// by the first factorial(5) call
}
Es ist wie das Original Beispiel verhält, aber die memoized Ergebnisse für factorial(0)
und factorial(1)
hatten mit einer init-Liste hinzugefügt werden, leider. Starten mit factorial(0) = 1;
hätte unendliche Rekursion verursacht. Wenn diese Version mit einem Wert von n
aufgerufen wird, fügt sie dem Memo automatisch alle fehlenden Faktorwerte hinzu, und zwar für alle positiven Ganzzahlen < = n
. Das Beste von allem, kann der Benutzer noch das Memo-Ergebnis für jede Eingabe wie folgt anpassen: factorial(5) = 0;
Hier ist ein Beispiel, das Klassen und Junk verwendet.
#include <iostream>
#include <unordered_map>
class factorial {
static std::unordered_map<int,int>& map() {
static std::unordered_map<int,int> outs;
return outs;
}
int n;
public:
factorial(int n) : n(n) {}
factorial& operator = (int out) {
map()[n] = out;
return *this;
}
operator int() const {
if(map().count(n)) return map()[n];
return factorial(n-1) * n;
}
};
int main() {
using std::cout;
// need to set low factorial values
// to prevent infinite recursion
factorial(0) = 1;
factorial(1) = 1;
cout << factorial(1) << '\n';
cout << factorial(5) << '\n';
cout << " ----\n";
factorial(1) = 123456789; // make factorial(1) better
cout << factorial(1) << '\n';
cout << factorial(5) << '\n'; // now factorial(5) is all messed up
cout << " ----\n";
factorial(5) = 120; // fix factorial(5)
cout << factorial(5) << '\n'; // worked!
}
Ausgang:
1
120
----
123456789
1929912792
----
120
Live Demo
Ihre Syntax ist sehr falsch. Vielleicht möchten Sie ein gutes Buch, eine Klasse oder ein Tutorial zu C++ finden (oder überprüfen Sie das Material, wenn Sie dies bereits tun). – crashmstr
Was versuchen Sie zu erreichen? Sie können einem Funktionsaufruf keinen Wert zuweisen factorial (0) = 1; ' – RomCoo
Was Sie mit den Faktoren (factorial (0) = 1;' und factorial (1) = 1; zu tun versuchen) wird hier geschrieben Weg: 'Wenn (n <= 1) 1 zurückgeben – Kapobajza