一.通过函数指针进行自调用
基本使用
- 头文件: #include
- 语法: std::function<return_type(args_type)>
代码展示
class Solution {
public:
int numWays(int n, vector<vector<int>> &relation, int k) {
vector<vector<int>> edges(n);
for (auto &edge : relation) {
int src = edge[0], dst = edge[1];
edges[src].push_back(dst);
}
int ways = 0;
function<void(int,int)> dfs = [&](int index, int steps) {
if (steps == k) {
if (index == n - 1) {
++ways; //因为这里ways的之发生了变化,所以要用&
}
return;
}
for (int to : edges[index]) {
dfs(to, steps + 1);
}
};
dfs(0, 0);
return ways;
}
};
其中return_type 是函数指针的返回值类型,像上面案例中dfs函数的 void 类型。
其中args_type 是函数指针的参数类型,有多个函数参数,就可以有多个数据类型。
二、自己调用自己
这个直接上代码吧!
class Solution {
public:
int numWays(int n, vector<vector<int>> &relation, int k) {
vector<vector<int>> edges(n);
for (auto &edge : relation) {
int src = edge[0], dst = edge[1];
edges[src].push_back(dst);
}
int ways = 0;
//auto&& 和 auto&区别不太大,都可
auto dfs = [&](auto&& dfs,int index, int steps) {
if (steps == k) {
if (index == n - 1) {
++ways; //因为这里ways的之发生了变化,所以要用&
}
return;
}
for (int to : edges[index]) {
dfs(dfs,to, steps + 1);
}
};
dfs(dfs,0, 0);
return ways;
}
};
三、1组正确和错误的样例展示
错误的主要原因是lambda无法推导出其要返回的类型,所以我们可以找一种无关情况,在前面做提前申明
最后用的一种,在后面用->void申明我们要返回的类型