##基本的な使い方
#include"memoization.hpp"
#include<iostream>
int test(int x)
{
/* とても重い処理(ただし参照透過) */
}
int main()
{
plasma::memoization<int(int)> func(test);
std::cout<<func(0)<<std::endl;
std::cout<<func(1)<<std::endl;
}
##再帰したい
#include"memoization.hpp"
#include<iostream>
int fact_i(int);
const plasma::memoization<int(int)> fact(fact_i);
int fact_i(int x)
{
return (x == 0 ? 1 : fact(x-1) * x);
}
int main()
{
std::cout<<fact(0)<<std::endl;
std::cout<<fact(1)<<std::endl;
std::cout<<fact(5)<<std::endl;
}
##競プロでも使いたい
/* ここらへんにmemoization.hppの中身をコピペする */
/* あとは普通に実装する */
安心と信頼のBoost Software License #注意点 ArgumentTypesの各typeでoperator==が実装されてる必要があります
#とても大切なお知らせ Yコンビネータを利用して再帰関数を定義できるバージョンを作りました。(memoization_recursion.hpp)
#include"memoization_recursion.hpp"
#include<iostream>
int main()
{
auto fib = plasma::recursion::memoization<double(int)>([](auto f, int x) {
return x == 0 ? 0 : (x == 1 ? 1 : f(x - 1) + f(x - 2));});
std::cout << fib(10) << std::endl;
}