概述
#include <iostream>
//constexpr int fibonacci() { //constexpr 是使得表达式在编译期间就进行计算,从而避免了运行期间的计算开销 通常用于常量表达式
// return fibonacci<n - 1>() + fibonacci < n - 2>(); 这个也是著名的斐波那契数列
//} 没用constexpr if
//
//template<> // 模板专门化
//constexpr int fibonacci<1>() { return 1; }
//
//template<>
//constexpr int fibonacci<0>() { return 0; }
template<int n>
constexpr int fibonacci() { // 著名的斐波那契数列
if constexpr (n >= 2) //constexpr 如果结合if 使模板编写更加简单
return fibonacci<n - 1>() + fibonacci < n - 2>(); //依次递归模板参数
else
return n;
}
template<typename...T> //可变模板参数
auto sumleft(T...s) { //折叠表达式 ...是当前递归值 s是下一个的值
return(... + s); // 这个是左折叠 ((((s2+s1)+s3)+s4)+sn) (((2+1)+3)+4) 依次递归模板函数参数 断点断不进去
//我所理解的...就类似operator 的左值 他是(...+s)...传递的是下一个值给s然后...又是下一个值 +
}
template<typename...T>
decltype(auto) sumright(T...s) {
return (s + ...); // 这个是右折表达式 (s1+(s2+(s3+(sn-1+sn)))) (1+(2+(3+(4+0))))) s就是当前值...就是下一个值
}
template<typename...Args>
void put(Args...args) {
((std::cout << args << 't'), ...) <<'n'; // 这个(...) 就是递归参数 递归下一个值
}
template<typename...Args>
void out(Args...args) { // []Lambda 表达式
([](const auto& x) { //匿名函数
std::cout << x << 't';
}(args),...); // args 递归当前值 ...递归下一个值
std::cout << 'n';
}
template<typename T>
void print(T end) {
std::cout << end << 'n';
}// 这种是基情形:只有一个参数
template<typename T, typename... Rest> // typename... 别名参数 ...就是可变模板参数 它里面可以存取多个不同类型的数
void print(T first, Rest...rest) { // 可变模板 声明函数参数
std::cout << first << "t"; // 递归情形
print(rest...); //第一次递归 cout<<2 print("Li",80.5)递归本函数因为可变模板里面还有两个参 以此类推 最后一个调用基情形
} //可变参数 但是只能通过递归方法写成递归函数 来拿到可变参数的值
int sum() { return 0; }
template<typename T1, typename...T>
auto sum(T1 s, T...ts){
std::cout << s << "t";
return s + sum(ts...); // 当sum里面的可变模板参数为空时调用 上面的sum 所以就是1 2 2+0 1+2 在这里ts是下一个值 ...是下下一个的值
} //递归求值这下断点是先 传递完所以的可变模板然后在进行反向加的
int main() {
print("Li");
print(2, "Li"); // 调用两个参<>类型推断
print(2, "LI", 80.5, 3, '6'); //那边的可变参数就是LI 80.5
std::cout << sum(1, 2) << 'n';
std::cout << sum(1, 2, 3) << 'n'; // 1 2 3 3+2 5+1
std::cout << fibonacci<10>() << 'n';
std::cout << sumleft(1, 2, 3, 4) << 'n';
std::cout << sumright(1, 2, 3, 4) << 'n';
put(1, 2, 3, 4);
out(1, 2, 3, 4);
while (true);
return 0;
}
最后
以上就是稳重可乐为你收集整理的用c++ 的可变模板参数递归来表达 著名的斐波那契数列的全部内容,希望文章能够帮你解决用c++ 的可变模板参数递归来表达 著名的斐波那契数列所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复