更新:这一个像学校上周六...
#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
}
它像原来的例子,但对于factorial(0)
和factorial(1)
的memoized结果必须与一个init列表添加,很遗憾。从factorial(0) = 1;
开始会导致无限递归。当使用值n
调用时,此版本还会自动将任何缺失的因子值添加到其备忘录中,对于所有正整数< = n
。最重要的是,用户仍然可以为任何输入定制memoized结果,如下所示:factorial(5) = 0;
下面是使用类和垃圾的示例。
#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!
}
输出:
1
120
----
123456789
1929912792
----
120
Live Demo
你的语法是非常错误的。您可能想要在C++上找到一本好书,课程或教程(如果您已经这样做,请查看材料)。 – crashmstr
你想达到什么目的?你不能为一个函数调用'factorial(0)= 1;' – RomCoo
分配一个值你想用'factorial(0)= 1;'和'factorial(1)= 1'来做什么?方式:'如果(n <= 1)返回1' – Kapobajza