我是靠谱客的博主 稳重可乐,最近开发中收集的这篇文章主要介绍用c++ 的可变模板参数递归来表达 著名的斐波那契数列,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#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++ 的可变模板参数递归来表达 著名的斐波那契数列所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部