Повысить лямбда-рекурсию?

Можно ли повысить :: лямбда рекурсивно?

Это не компилируется:

using namespace boost::lambda;

auto factorial = (_1 == 0) ? 1 : factorial(_1-1);

Есть ли предложенное решение?

РЕДАКТИРОВАТЬ: Относительно использования C ++ 11 лямбда-выражений: Следующее не компилируется на VS2012:

std::function<int(int)> factorial;
factorial = [&factorial](int p)->int { return (p == 0) ? 1 : p*factorial(p-1); };

int main(int argc, char* argv[])
{
int i = factorial(5);
return 0;
}

ДРУГОЕ РЕДАКТИРОВАНИЕ: Странно, этот работает отлично:

std::function<int(int)> factorial =
[&](int p)->int { return (p == 0) ? 1 : p*factorial(p-1); };

int main(int argc, char* argv[])
{
int i = factorial(5);
return 0;
}

0

Решение

Лямбда-функции не могут напрямую вызывать себя, потому что у них нет имени.

Обходной путь прост: используйте именованную функцию.

1

Другие решения

Самый простой способ, который я нашел с обычными лямбдами C ++ 11, — это объявить переменную, которая сначала будет содержать лямбду, а затем определить ее и создать лямбду. Уже будучи объявленным, можно использовать объявление в самом определении / лямбде. Например:

std::function<int (int)> factorial = nullptr;
factorial = [](int x) -> int {
if (x <= 1) {
return 1;
} else {
return (x * factorial(x-1));
}
};

До сих пор у меня не было проблем с этим методом, хотя вы должны знать сигнатуру для объявления, и я не знаю, работает ли он с boost :: lambda (я бы так предположил?).

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector