lambda函数可以递归吗?

fre*_*low 82 c++ recursion lambda c++11

可能重复:
c ++ 0x中的递归lambda函数

这是一个普通的旧递归函数:

int fak(int n)
{
    return (n <= 1) ? 1 : n * fak(n - 1);
}
Run Code Online (Sandbox Code Playgroud)

我如何编写像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
Run Code Online (Sandbox Code Playgroud)

是否有任何表达当前lambda的表达式,因此它可以递归调用自身?

And*_*owl 111

是的他们可以.您可以将它存储在变量中并引用该变量(尽管您不能将该变量的类型声明为auto,但您必须使用std::function对象).例如:

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

否则,不,你不能this从lambda体内引用指针.

  • 另请注意,此类功能无法安全返回. (28认同)
  • @ R.MartinhoFernandes:好的一点是,它将通过引用捕获超出范围的本地对象.您仍然可以使用`shared_ptr`我猜(?),但这可能是一种迷信. (4认同)
  • 嗯,为什么`auto`不能用于lambda类型?我希望这是可能的,只要我为lambda主体指定返回类型即可。傻C ++ :( (3认同)
  • 我需要通过引用来捕获_think_`factial`,但我并非100%正面. (2认同)