c++ lambda 递归调用

创建日期: 2024-10-16 16:03 | 作者: 风波 | 浏览次数: 15 | 分类: C++

来源:https://blog.csdn.net/J__M__C/article/details/125437699

方法一:C++11 借助 std::function

#include <iostream>
#include <functional>
int main(int argc, char* argv[])
{
    std::function<int(int)> fib = [&fib](int n) { return n < 2 ? n : fib(n - 1) + fib(n - 2); };
    std::cout << fib(5);
    return 0;
}

注意⚠️需要将 fib 变量自己绑定。

方法二:C++14 基于Y不动点组合子(Y Combinator)

使用了来自C++14的泛型lambda,即支持在lambda表达式的参数列表中使用auto

#include <iostream>

int main() {
    auto T = [&](auto x) { return [&](auto y) { return y([&](auto z) {return x(x)(y)(z); }); }; };
    auto X = T(T);
    auto fib = X([](auto f) { return [&](auto n)->int { return n < 2 ? n : f(n - 1) + f(n - 2); }; });
    std::cout << fib(5);
    return 0;
}

或者

#include <iostream>
int main(int argc, char* argv[])
{
    auto fib = [](auto&& self, int n, int i = 0, int num1 = 0, int num2 = 1) {
        if (i >= n) return num1;
        else return self(self, n, i + 1, num2, num1 + num2);
    };
    std::cout << fib(fib, 5);
    return 0;
}

合并后

#include <iostream>
int main(int argc, char* argv[])
{
    auto fib = [](int n) {
        auto f = [](auto&& self, int n, int i = 0, int num1 = 0, int num2 = 1) {
            if (i >= n) return num1;
            else return self(self, n, i + 1, num2, num1 + num2); 
        };
        return f(f, n); 
    };
    std::cout << fib(5);
    return 0;
}

优化后

#include <iostream>
int main(int argc, char* argv[])
{
    auto fib = [
        f = [](auto&& self, int n, int i = 0, int num1 = 0, int num2 = 1) {
                if (i >= n) return num1;
                else return self(self, n, i + 1, num2, num1 + num2);
        }](int n) { return f(f, n); };;
    std::cout << fib(5);
    return 0;
}

方法三:C++23 借助Deducing this实现lambda递归

#include <iostream>
int main(int argc, char* argv[])
{
    auto fib = [] self(int n) {
        if (n < 2) return n;
        return self(n - 1) + self(n - 2);
    };
    std::cout << fib(5);
    return 0;
}
15 浏览
13 爬虫
0 评论