
#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";
}