auto Y_ = [](auto h) {
return ([](auto f) { return f(f); })
([h](auto f) {
return h([f](auto ... n) {
return f(f)(n...);
});
});
};
#define REC(NAME, FUN) Y_([](auto NAME){ return [NAME] FUN;})
//////////////////////////////////////////////
#include <iostream>
int main()
{
// EXAMPLES
// factorial
auto fact = REC(g,
(auto n) {
if (n < 2) return 1;
return n * g(n - 1);
});
// fibonacci
auto fib = REC(g,
(auto n) -> int {
return n > 1 ? g(n - 1) + g(n - 2) : n;
});
// binomial coefficient
auto comb = REC(g,
(auto x, auto y) {
if (y == 0 || x == y) return 1;
return g(x - 1, y - 1) + g(x - 1, y);
});
std::cout << fact(6) << "\n";
std::cout << fib(10) << "\n";
std::cout << comb(10, 4) << "\n";
return 0;
}
YXV0byBZXyA9IFtdKGF1dG8gaCkgewoJcmV0dXJuIChbXShhdXRvIGYpIHsgcmV0dXJuIGYoZik7IH0pCgkoW2hdKGF1dG8gZikgewoJCXJldHVybiBoKFtmXShhdXRvIC4uLiBuKSB7CgkJCXJldHVybiBmKGYpKG4uLi4pOwoJCX0pOwoJfSk7Cn07CgojZGVmaW5lIFJFQyhOQU1FLCBGVU4pIFlfKFtdKGF1dG8gTkFNRSl7IHJldHVybiBbTkFNRV0gRlVOO30pCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgojaW5jbHVkZSA8aW9zdHJlYW0+CgppbnQgbWFpbigpCnsKCS8vIEVYQU1QTEVTCgkKCS8vIGZhY3RvcmlhbAoJYXV0byBmYWN0ID0gUkVDKGcsCgkJKGF1dG8gbikgewoJCQlpZiAobiA8IDIpIHJldHVybiAxOwoJCQlyZXR1cm4gbiAqIGcobiAtIDEpOwoJCX0pOwoKCS8vIGZpYm9uYWNjaQoJYXV0byBmaWIgPSBSRUMoZywKCQkoYXV0byBuKSAtPiBpbnQgewoJCQlyZXR1cm4gbiA+IDEgPyBnKG4gLSAxKSArIGcobiAtIDIpIDogbjsKCQl9KTsKCgkvLyBiaW5vbWlhbCBjb2VmZmljaWVudAoJYXV0byBjb21iID0gUkVDKGcsCgkJKGF1dG8geCwgYXV0byB5KSB7CgkJCWlmICh5ID09IDAgfHwgeCA9PSB5KSByZXR1cm4gMTsKCQkJcmV0dXJuIGcoeCAtIDEsIHkgLSAxKSArIGcoeCAtIDEsIHkpOwoJCX0pOwoJCglzdGQ6OmNvdXQgPDwgZmFjdCg2KSAgICAgPDwgIlxuIjsKCXN0ZDo6Y291dCA8PCBmaWIoMTApICAgICA8PCAiXG4iOwoJc3RkOjpjb3V0IDw8IGNvbWIoMTAsIDQpIDw8ICJcbiI7CgkKCXJldHVybiAwOwp9Cg==