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

49 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论