c++lambda表达式写递归
时间: 2023-07-06 12:16:37 浏览: 175
在C++中,Lambda表达式可以用于编写递归函数。下面是一个使用Lambda表达式实现递归的示例代码:
```c++
#include <iostream>
#include <functional>
int main() {
std::function<int(int)> factorial = [&](int n) {
return n <= 1 ? 1 : n * factorial(n - 1);
};
std::cout << factorial(5) << std::endl; // 输出120
return 0;
}
```
在上面的代码中,我们使用了`std::function`模板类来定义一个函数对象`factorial`,并使用Lambda表达式来实现递归。Lambda表达式使用了一个引用捕获符`&`,表示捕获当前作用域中的所有变量,使得递归函数能够访问当前作用域中的变量。在Lambda表达式中,使用了三目运算符`? :`来实现递归的终止条件和递归调用。
相关问题
lambda表达式c++ 递归
lambda表达式是一种匿名函数,可以在需要函数对象的地方使用。lambda表达式可以递归调用自身,但是lambda无法推断其类型。为了实现lambda表达式的递归调用,可以使用一个引用参数来引用自己,通过调用的方式来推测出引用的是什么类型。比如,可以使用一个引用参数来引用自身,并在lambda表达式中递归调用该引用参数。例如,可以使用如下方式实现lambda表达式的递归调用:
```cpp
auto f1 = [](auto&& me, int j) -> int {
if (j == 0) {
return 0;
} else {
return me(me, j - 1);
}
};
cout << f1(f1, 5) << endl;
```
在这个例子中,通过使用引用参数me来引用自身,实现了lambda表达式的递归调用。这样,调用f1(f1, 5)就可以得到lambda表达式的递归结果了。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *3* [C++使用lambda表达式写递归](https://blog.csdn.net/qq_42987967/article/details/123800206)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* [C++11-lambda表达式](https://blog.csdn.net/weixin_45599288/article/details/123114579)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
C++lambda表达式的所有写法
C++ lambda表达式提供了一种简洁的方式来定义匿名函数,它们通常用于函数对象(functor),可以作为参数传递给其他函数,或者在需要临时函数的地方使用。这里有两种主要的写法:
1. **基础形式**[^2]:
```cpp
auto f = [] (int a) -> int {
return a + 1;
};
```
这里,`[]`是lambda捕获列表(capture list),`(int a)`是参数列表,`-> int`是返回类型。
2. **自省形式**(如果需要访问外部作用域的变量):
```cpp
int x = 10;
auto f = [x] (int a) -> int {
return a + x;
};
```
`x`被自动捕获(按值)。
3. **捕获列表明确指定**:
```cpp
auto f = [this] (int a) -> int {
return a + this->x; // 如果x是成员变量
};
```
或者
```cpp
auto f = [i = 0] (int a) -> int {
return a + i++;
};
```
使用`[=]`表示不捕获任何东西,`[&]`表示捕获所有按引用,`[i]`捕获单个变量`i`。
4. **默认参数**:
```cpp
auto f = [default_value = 0] (int a = default_value) -> int {
return a + default_value;
};
```
5. **嵌套lambda**:
```cpp
auto outer = [] {
auto inner = [] (int a) -> int {
return a * a;
};
return inner(3);
};
std::cout << outer(); // 输出: 9
```
6. **递归lambda**[^1](仅限于C++11及以上版本):
```cpp
auto factorial = [f = &factorial](unsigned n) mutable -> unsigned {
if (n == 0)
return 1;
else
return n * f(n - 1);
};
std::cout << factorial(5); // 输出: 120
```
注意`mutable`关键字允许在递归调用内部修改函数自身。
阅读全文