#include <functional>
#include <iostream>
#include <map>
using namespace std;
function<int(int)> memoize(function<int(int)> func)
{
map<int, int> results;
function<int(int)> memoized([&] (int i) {
if(results.count(i)) {
return results[i];
} else {
int result = func(i);
results.insert(pair<int, int>(i, result));
return result;
}
});
return memoized;
}
int fib(int i)
{
if (i == 0 || i == 1) {
return i;
} else {
return fib(i - 1) + fib(i - 2);
}
}
int main()
{
auto fibm = memoize(&fib);
cout << fibm(23) << endl;
cin.get();
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPG1hcD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpmdW5jdGlvbjxpbnQoaW50KT4gbWVtb2l6ZShmdW5jdGlvbjxpbnQoaW50KT4gZnVuYykKewogICAgbWFwPGludCwgaW50PiByZXN1bHRzOwoKICAgIGZ1bmN0aW9uPGludChpbnQpPiBtZW1vaXplZChbJl0gKGludCBpKSB7CgogICAgICAgIGlmKHJlc3VsdHMuY291bnQoaSkpIHsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNbaV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW50IHJlc3VsdCA9IGZ1bmMoaSk7CiAgICAgICAgICAgIHJlc3VsdHMuaW5zZXJ0KHBhaXI8aW50LCBpbnQ+KGksIHJlc3VsdCkpOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICB9KTsKCiAgICByZXR1cm4gbWVtb2l6ZWQ7Cn0KCmludCBmaWIoaW50IGkpCnsKICAgIGlmIChpID09IDAgfHwgaSA9PSAxKSB7CiAgICAgICAgcmV0dXJuIGk7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmaWIoaSAtIDEpICsgZmliKGkgLSAyKTsKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBhdXRvIGZpYm0gPSBtZW1vaXplKCZmaWIpOwogICAgY291dCA8PCBmaWJtKDIzKSA8PCBlbmRsOwoKICAgIGNpbi5nZXQoKTsKfQ==