#include <iostream>
#include <unordered_map>
#include <functional>
#include <memory>
#include <map>
template <typename R, typename... Args>
std::function<R(Args...)> cache(R(*func) (Args...)) {
auto result_map = std::make_shared<std::map<std::tuple<Args...>, R>>(); // key -- 函数参数列表 value -- 函数返回值
return ([=] (Args... args) {
std::tuple<Args...> t(args...);
if (result_map->find(t) == result_map->end()) {
(*result_map)[t] = func(args...);
}
return (*result_map)[t];
});
}
template <typename R, typename... Args>
std::function<R(Args...)> sugar(R(*func)(Args...), bool needClear = false) {
using function_type = std::function<R(Args...)>;
static std::unordered_map<decltype(func), function_type>functor_map;
if (needClear) {
return functor_map[func] = cache(func);
}
if (functor_map.find(func) == functor_map.end()) {
functor_map[func] = cache(func);
}
return functor_map[func];
}
size_t fibonacci(size_t n) {
return (n < 2) ? n : fibonacci(n - 1) + fibonacci(n - 2);
}
size_t fibonacci1(size_t n) {
if (n < 2) {
return n;
}
int a = 0;
int b = 1;
int c = 0;
for (int i = 2;i <= n;i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
size_t fibonacci2(size_t n) {
return (n < 2) ? n : sugar(fibonacci2)(n - 1) + sugar(fibonacci2)(n - 2);
}
int main() {
//size_t n = fibonacci(45); // 5.883s
//size_t n = fibonacci1(45); // 0.005s
size_t n = fibonacci2(45); // 0.006s
std::cout << n << std::endl;
return 0;
}