#include #include template struct RecursiveFunc { std::function o; }; template std::function Y (std::function(std::function)> f) { RecursiveFunc> r = { std::function(RecursiveFunc>)>([f](RecursiveFunc> w) { return f(std::function([w](A x) { return w.o(w)(x); })); }) }; return r.o(r); } typedef std::function Func; typedef std::function FuncFunc; FuncFunc almost_fac = [](Func f) { return Func([f](int n) { if (n <= 1) return 1; return n * f(n - 1); }); }; FuncFunc almost_fib = [](Func f) { return Func([f](int n) { if (n <= 2) return 1; return f(n - 1) + f(n - 2); }); }; int main() { auto fib = Y(almost_fib); auto fac = Y(almost_fac); std::cout << "fib(10) = " << fib(10) << std::endl; std::cout << "fac(10) = " << fac(10) << std::endl; return 0; }