C++中如何使用lambda实现递归

在用C++刷leetcode时,我希望把一个递归函数像js、python那样写在运行函数内部,那么可以使用functionlambda表达式来实现。但如果这个递归函数的参数比较多,那么function的模板参数同样需要写很多,能不能用auto来实现得简单一点呢?

在C++中,使用lambda表达式实现递归时,由于lambda本身没有显式的类型名,需要通过一些技巧来实现递归调用。使用auto&&作为参数类型是其中一种常见的做法:

Lambda表达式的类型推断:C++中的lambda表达式没有类型名,意味着无法直接在lambda内部调用自身。如果直接将lambda表达式定义为递归函数,会遇到无法识别的编译错误。

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

int main() {
auto factorial = [](auto&& self, int n) -> int {
if (n <= 1) return 1;
return n * self(self, n - 1); // 递归调用lambda
};

std::cout << factorial(factorial, 5) << std::endl; // 输出120
return 0;
}

这里不像js、python直接定义就好了,还需要多写一个通用引用(什么是通用引用,可参考这篇博客),具体为什么我也暂时不清楚,只知道和Y组合子的知识点有关。