【问题标题】:Can lambda functions be recursive? [duplicate]lambda函数可以递归吗? [复制]
【发布时间】:2013-01-10 00:26:12
【问题描述】:

可能重复:
Recursive lambda functions in c++0x

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

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,以便它可以递归地调用自己?

【问题讨论】:

  • 可能有巨大的 std::function 开销或多态 lambdas。
  • @MichaelBurr,你有很好的链接。
  • 糟糕 - 我不小心删除了我的评论。这是后面的链接:blogs.msdn.com/b/vcblog/archive/2008/11/18/…
  • @MichaelBurr,这很有趣。我觉得你不小心删除了你的评论的想法很可笑,但我可以理解做这样的事情是多么容易:p
  • 我要把这个留在这里slideshare.net/adankevich/c11-15621074 29 slide

标签: c++ recursion c++11 lambda


【解决方案1】:

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

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

否则,不,您不能从 lambda 主体内部引用 this 指针。

【讨论】:

  • 认为 factorial需要被引用捕获,但我不是100%肯定的。
  • 还要注意这样的函数不能安全返回。
  • @R.MartinhoFernandes:很好,它会通过引用捕获超出范围的本地对象。我猜你仍然可以使用shared_ptr(?),但这可能有点迷信。
  • @rikimaru2013 返回它会破坏局部变量,并且该函数具有对该局部变量的引用。
  • 嗯,为什么 auto 不能用于 lambda 的类型?只要我为 lambda 主体指定返回类型,我希望这是可能的。愚蠢的 C++ :(
猜你喜欢
  • 2013-05-05
  • 2010-10-03
  • 2021-12-17
  • 2010-09-16
  • 2011-03-05
  • 2014-10-10
  • 2012-12-30
相关资源
最近更新 更多