题目开始前还是要说一下,这道题目虽然有多种做法,用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分
55 人评分