sine之舞

在这里插入图片描述

一、解题思路:<<递归>>

1、首先,我们需要找到公式An以及Sn的规律,对此,我们可以写出前面几个值:

对于An有:

A1=sin(1)
A2=sin(1-sin(2))
A3=sin(1-sin(2+sin(3)))

对于Sn有:(下方的An可直接将上面计算出的An式子代入,就意味着Sn函数中会调用An函数)

A1=A1+1
A2=(A1+2)A2+1
A3=((A1+3)A2+2)A3+1
2、找到基本规律后,我们便可写出两个分别计算An以及Sn的功能函数(具体详见下方完整代码)
3、编写主函数,调用功能函数,完成代码编写。
4、检验代码正确与否即可

二、完整代码

#include<iostream>
using namespace std;
//由写出的A1~A3表达式可得规律:由An中的n决定sin()嵌套次数或深度
//从左向右或从外向内看,括号内的数字是由1嵌套到n 
void An(int i,int n)//i可看做目前递归次数,n为计算An所需递归次数 
{
	if(i==n)//递归终止条件,达到递归次数或深度则停止递归并返回递归上一层 
	{
		cout<<"sin("<<i<<")";
	}
	else
	{//由于表达式中'+'、'-'符号成规律变化,故需分类判断 
		if(i%2==0)
		{
			cout<<"sin("<<i<<'+';
			An(i+1,n);//未达到递归次数或深度则向内递归得到深层sin()表达式 
			cout<<")";
		}
		else
		{
			cout<<"sin("<<i<<'-';
			An(i+1,n);//未达到递归次数或深度则向内递归得到深层sin()表达式 
			cout<<")";
		}
	}
}
//与An规律相似,Sn表达式层层嵌套,但不同的是,Sn中下表大的在外面
//故Sn函数是从n递归到1,此外还要注意表达式中的数字页是从外到内逐次加1 
void Sn(int n,int i)//n表示所要求的Sn的下标,i表示表达式中的数字 
{
	if(n==1)//由于是从大到小递归,故终止条件是n==1 
	{
		An(1,n);//调用An函数,输出A1表达式 
		cout<<'+'<<i;
	}
	else
	{
		cout<<"(";
		Sn(n-1,i+1);//深层递归,求嵌套内部的表达式 
		cout<<")";
		An(1,n);//调用An函数,输出An表达式 
		cout<<'+'<<i;
	}
}
int main()
{
	int N; //N表示所要求的Sn的下标 
	cin>>N;
	Sn(N,1);//调用函数Sn输出Sn表达式 
	return 0;
}
PS:以上为本人拙见,首次写题解,若有错误,望大家不吝赐教,共同进步,十分感谢!!!
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值