lambda 函数可以递归吗?[复制]

Can lambda functions be recursive? [duplicate]

提问人:fredoverflow 提问时间:1/26/2013 最后编辑:Communityfredoverflow 更新时间:6/9/2022 访问量:31401

问:

这个问题在这里已经有答案了:
10年前关闭。

可能的重复项:
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,以便它可以递归地调用自己?

C++ 递归 C++11 Lambda

评论

1赞 ipc 1/26/2013
可能具有巨大的 std::function 开销或多态 lambda。
0赞 chris 1/26/2013
@MichaelBurr,你在那里有很好的链接。
2赞 Michael Burr 1/26/2013
哎呀 - 我不小心删除了我的评论。这是后面的链接: blogs.msdn.com/b/vcblog/archive/2008/11/18/...
0赞 chris 1/26/2013
@MichaelBurr,这很有趣。我觉得你不小心删除了你的评论的想法很可笑,但我可以理解做这样的事情是多么容易:p
0赞 innochenti 1/30/2013
我只想把这个留在这里 slideshare.net/adankevich/c11-15621074 29 张幻灯片

答:

122赞 Andy Prowl 1/26/2013 #1

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

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

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

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

评论

2赞 ildjarn 1/26/2013
我认为需要通过参考来捕捉,但我不是 100% 肯定的。factorial
31赞 R. Martinho Fernandes 1/26/2013
另请注意,此类函数无法安全返回。
4赞 Andy Prowl 1/26/2013
@R.MartinhoFernandes:很好,它将通过引用捕获超出范围的局部对象。你仍然可以使用我猜(?),但那可能是一种恋物癖。shared_ptr
1赞 R. Martinho Fernandes 5/12/2016
@rikimaru2013返回它会销毁局部变量,并且该函数具有对该局部变量的引用。
3赞 Lightness Races in Orbit 8/12/2016
嗯,为什么不能用于 lambda 的类型?只要我为 lambda 正文指定返回类型,我就希望这是可能的。傻傻的C++ :(auto