#include <chrono>
#include <functional>
#include <iostream>
#include <vector>
typedef unsigned long long Integer;
void recurse(Integer i, Integer& sum)
{
sum += i;
if ( i > 0 )
{
recurse(i - 1, sum);
}
}
int main()
{
const Integer n(50000ull);
const auto t_0(std::chrono::high_resolution_clock::now());
Integer sum(0);
recurse(n, sum);
const auto t_1(std::chrono::high_resolution_clock::now());
std::function<void(Integer, Integer&)> lambda_recurse([&lambda_recurse](Integer i, Integer& l_sum)
{
l_sum += i;
if ( i > 0 )
{
lambda_recurse(i - 1, l_sum);
}
});
Integer lambda_sum(0);
lambda_recurse(n, lambda_sum);
const auto t_2(std::chrono::high_resolution_clock::now());
std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(t_1 - t_0).count() << "\n";
std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(t_2 - t_1).count() << "\n";
}
CiNpbmNsdWRlIDxjaHJvbm8+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBJbnRlZ2VyOwoKdm9pZCByZWN1cnNlKEludGVnZXIgaSwgSW50ZWdlciYgc3VtKQp7CiAgIHN1bSArPSBpOwogICBpZiAoIGkgPiAwICkKICAgewogICAgICByZWN1cnNlKGkgLSAxLCBzdW0pOwogICB9Cn0KCmludCBtYWluKCkKewogICBjb25zdCBJbnRlZ2VyIG4oNTAwMDB1bGwpOwogICBjb25zdCBhdXRvIHRfMChzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKSk7CiAgIEludGVnZXIgc3VtKDApOwogICByZWN1cnNlKG4sIHN1bSk7CiAgIGNvbnN0IGF1dG8gdF8xKHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpKTsKICAgc3RkOjpmdW5jdGlvbjx2b2lkKEludGVnZXIsIEludGVnZXImKT4gbGFtYmRhX3JlY3Vyc2UoWyZsYW1iZGFfcmVjdXJzZV0oSW50ZWdlciBpLCBJbnRlZ2VyJiBsX3N1bSkKICAgewogICAgICBsX3N1bSArPSBpOwogICAgICBpZiAoIGkgPiAwICkKICAgICAgewogICAgICAgICBsYW1iZGFfcmVjdXJzZShpIC0gMSwgbF9zdW0pOwogICAgICB9CiAgIH0pOwogICBJbnRlZ2VyIGxhbWJkYV9zdW0oMCk7CiAgIGxhbWJkYV9yZWN1cnNlKG4sIGxhbWJkYV9zdW0pOwogICBjb25zdCBhdXRvIHRfMihzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKSk7CiAgIHN0ZDo6Y291dCA8PCBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bmFub3NlY29uZHM+KHRfMSAtIHRfMCkuY291bnQoKSA8PCAiXG4iOwogICBzdGQ6OmNvdXQgPDwgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzPih0XzIgLSB0XzEpLmNvdW50KCkgPDwgIlxuIjsKfQ==