递归

使用匿名函数无法实现递归。

lambda实现递归:先声明后赋值实现尾递归

  1. 将lambda赋给变量。
  2. 在"函数对象参数"中引用该变量,

    即可在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);

   

posted @ 2020-01-28 18:05  退笔成山  阅读(159)  评论(0)    收藏  举报