MyTetra Share
Делитесь знаниями!
Как определить рекурсивную лямбду в C++
20.02.2019
18:54
Текстовые метки: c++, лямбда, рекурсия
Раздел: Компьютер - Программирование - Язык C++

Представьте, что нужно написать лямбду, представляющую функцию Фибоначчи. Эта лямбда по-пределению должна быть рекурсивной. Если вы попытаетесь записать ее, используя в качестве возвращаемого значения автоматический тип auto, то получите ошибку компиляции:


auto fib = [&fib](int n) {return n < 2 ? 1 : fib(n-1) + fib(n-2);};


Ошибка:


error C3533: 'auto &': a parameter cannot have a type that contains 'auto'

error C3531: 'fib': a symbol whose type contains 'auto' must have an initializer

error C3536: 'fib': cannot be used before it is initialized

error C2064: term does not evaluate to a function taking 1 arguments


Проблема в том, что из-за рекурсии, здесь имеет место быть циклическая зависимость. Чтобы избавиться от нее, необходимо явно определить тип функции, используя std::function:

std::function<int(int)> lfib = [&lfib](int n) {return n < 2 ? 1 : lfib(n-1) + lfib(n-2);};



Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования