Ниже представлен пример использования рекурсии с использованием лямбда-выражения
#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;
}