C++11. Recursion in lambda expression

Ниже представлен пример использования рекурсии с использованием лямбда-выражения

#include <iostream>
#include <functional>

// recursive print function
std::function<void (const std::string&, int)> print = [&] (const std::string& str, int times) {
    std::cout << str;
    if (times > 1) print(str, times - 1);
};

int main() {
   
    print("!", 5); // !!!!!

    return 0;
}


В данном примере в лямбда-выражении в списке захвата задан неявный захват по ссылке без которого Вы получите ошибку времени компиляции. Если Вам необходимо ограничить область захвата, тогда можно уточнить сие в списке захвата:

std::function<void (const std::string&, int)> print = [&print] (const std::string& str, int times) {
    std::cout << str << std::endl;
    if (times > 1) print(str, times - 1);
};


Где этим можно воспользоваться, ведь намного эффективней явно определить такого рода рекурсивную функцию:

void print(const std::string& str, int n = 1) {
    std::cout << str;
    if (n > 1) print(str, n - 1);
};


Все конечно зависит от задачи и Вашей фантазии. Ниже приведен один пример, где использован данный подход для сохранения общего интерфейса функций сортировки:

#include <iostream>
#include <vector>
#include <functional>

namespace util {
    using namespace std;

    void selection_sort(vector<int>& vec, int len);

    void insertion_sort(vector<int>& vec, int len);

    void bubble_sort(vector<int>& vec, int len);

    void quick_sort(vector<int>& vec, int len) {
        std::function<void (vector<int>&, int, int)> sorter = [&] (vector<int>& vec, int l, int r) {
            int x = vec[l + (r - l) / 2];
            int i = l;
            int j = r;

            while(i <= j) {
                while(vec[i] < x) i++;
                while(vec[j] > x) j--;

                if (i <= j) {
                    swap(vec[i], vec[j]);
                    i++;
                    j--;
                }
            }

            if (i < r) sorter(vec, i, r);
            if (l < j) sorter(vec, l, j);
        };

        sorter(vec, 0, len - 1);
    }
}


int main() {

    std::vector<int> numbers = {10, 1, 9, 2, 8, 3, 7, 4, 6, 5};
    util::quick_sort(numbers, numbers.size()); // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

    return 0;
}