提问人:fredoverflow 提问时间:1/26/2013 最后编辑:Communityfredoverflow 更新时间:6/9/2022 访问量:31401
lambda 函数可以递归吗?[复制]
Can lambda functions be recursive? [duplicate]
问:
可能的重复项:
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,以便它可以递归地调用自己?
答:
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 存储在变量中并引用该变量(尽管您不能将该变量的类型声明为 ,但您必须改用对象)。例如:auto
std::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
评论