原题链接:蓝桥杯基础练习VIP-Sine之舞
题目开始前还是要说一下,这道题目虽然有多种做法,用for循环也能完成任务,但是这道题目的训练主要是
考研我们的“递归”的掌握,所以建议用递归的做法,单你掌握了递归做法时再考虑其他。
解题思路: 其实题目就是数列的求Sn
由题目可知:
对于An有:
A1=sin(1)
A2=sin(1-sin(2))
A3=sin(1-sin(2+sin(3)))
对于Sn有:
S1=A1+1
S2=(A1+2)A2+1
S3=((A1+3)A2+2)A3+1
从上面咱可以看出如果忽略掉“+ -”号An明显存在嵌套
同理Sn忽略掉“+k”k的数值,也可以看做嵌套
所以我们只要在递归时注意一点就行
注意事项: 求An时要注意“+ -”号,Sn时要注意+K k的值
参考代码:
(1)求An 的递归函数:i代表目前递归的深度,n代表你要递归的深度即An的n
void An(int i, int n){ if(i==n) cout<<"sin("<<i<<")"; else{ if(i%2){ cout<<"sin("<<i<<"-"; An(i+1,n); cout<<")"; } else{ cout<<"sin("<<i<<"+"; An(i+1,n); cout<<")"; } } }
(2)求Sn的递归函数:同理i代表当前深度,n代表你要求的深度
void Sn(int i,int n){ if(n==1){ An(1,1); cout<<"+"<<i; } else{ cout << "("; Sn(i+1,n-1); cout << ")"; An(1,n); cout << "+" << i; } }
完整代码:对你有用麻烦给个十分,谢谢
#include<iostream> using namespace std; void An(int i, int n){ if(i==n) cout<<"sin("<<i<<")"; else{ if(i%2){ cout<<"sin("<<i<<"-"; An(i+1,n); cout<<")"; } else{ cout<<"sin("<<i<<"+"; An(i+1,n); cout<<")"; } } } void Sn(int i,int n){ if(n==1){ An(1,1); cout<<"+"<<i; } else{ cout << "("; Sn(i+1,n-1); cout << ")"; An(1,n); cout << "+" << i; } } int main(){ int n; cin >> n; Sn(1,n); return 0; }
0.0分
49 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复