来源: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;
}