递归
使用匿名函数无法实现递归。
lambda实现递归:先声明后赋值实现尾递归
- 将lambda赋给变量。
- 在"函数对象参数"中引用该变量,
即可在lambda内部调用自己,从而实现递归。
- 缺点:若如此实现尾递归,则不能使用默认参数。
优先使用尾递归,方便编译器将尾递归优化成循环。
demo:
std::function<int(int, int, int)> sum; sum = [&sum](int begin, int end, int _sum)->int { if (begin > end) return _sum; return sum(begin + 1, end, _sum + begin); }; auto res = sum(1, 10, 0); |
更进一步,将求和操作提出来
//从begin遍历到end,可以调用自定义函数 std::function<int(int, int, int, std::function<int(int, int)>)> traverse; traverse = [&traverse](int begin, int end, int res, std::function<int(int, int)> f)->int { if (begin > end) return res; return traverse(begin + 1, end, f(begin, res), f); }; |
auto sum = [](int oprd, int res)->int { return oprd + res; }; auto ans = traverse(1, 5, 0, sum); |
auto fact = [&traverse, &mul](int res)->int { return traverse(1, res, 1, mul); }; auto ans = traverse(1, 5, 1, mul); |
auto fact = [&traverse, &mul](int res)->int { return traverse(1, res, 1, mul); }; auto ans = fact(5); |
综上,求阶乘函数
//从begin遍历到end,可以调用自定义函数 std::function<int(int, int, int, std::function<int(int, int)>)> traverse; traverse = [&traverse](int begin, int end, int res, std::function<int(int, int)> f)->int { if (begin > end) return res; return traverse(begin + 1, end, f(begin, res), f); }; auto fact = [&traverse, &mul](int res)->int { return traverse(1, res, 1, mul); };
auto ans = fact(5); |
或者
std::function<int(int, int)> _fact; _fact = [&_fact](int n, int res)->int { return n <= 1 ? res : _fact(n - 1, res * n); };
//"先声明后赋值实现尾递归"不能使用默认参数,故封装阶乘函数 auto fact = [&_fact](int n = 0)->int { return _fact(n, 1); }; auto ans = fact(5); |

浙公网安备 33010602011771号