Lambda 函数可以是递归的吗?

可能的复制品:
C + + 0x 中的递归 lambda 函数

下面是一个普通的递归函数:

int fak(int n)
{
return (n <= 1) ? 1 : n * fak(n - 1);
}

如何编写这样一个递归函数作为 lambda 函数?

[](int n) { return (n <= 1) ? 1 : n * operator()(n - 1); }
// error: operator() not defined


[](int n) { return (n <= 1) ? 1 : n * (*this)(n - 1); }
// error: this wasn't captured for this lambda function

有没有表达式表示当前的 lambda,这样它就可以递归地调用自己?

29917 次浏览

是的,他们可以。从 C + + 23开始,你可以使用显式的 this 参数:

auto factorial = [](this auto self, int i)
{
return (i == 1) ? 1 : i * self(i - 1);
};

使用以前的 C + + 标准,可以将 lambda 存储在变量中并引用该变量(尽管不能将该变量的类型声明为 auto,但必须使用 std::function对象)。例如:

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