蓝桥杯 试题 基础练习 Sine之舞(递归)

问题描述

  最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。
  不妨设
  An=sin(1–sin(2+sin(3–sin(4+...sin(n))...)
  Sn=(...(A1+n)A2+n-1)A3+...+2)An+1
  FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。

输入格式

  仅有一个数:N<201。

输出格式

  请输出相应的表达式Sn,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。

样例输入

3

样例输出

((sin(1)+3)sin(1–sin(2))+2)sin(1–sin(2+sin(3)))+1

解题思路:

对于An,递归模式是sin(i+An)和sin(i-An),括号最里面的是n,所有从1到n递归。

对于Sn,把A1+n看成是 ()A1+n,很容易看出递归模式是 ()An+n+i-1 ,括号最里面的是A1,所有从n到1递归。当然这是相对的,如果看成括号最里面的是n,也可以1到n递归。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<string>
#include<cmath>
using namespace std;
int n;
string fA(int i,int N){
	if(i==N)//结束递归的标志
	{
		string s="sin(";
		s+=(i+'0');
		s+=")";
		return s;
	}
	string str="sin(";
	str+=(i+'0');
	if(i%2==0)
		str+="+";
	else
		str+="-";	
	str+=fA(i+1,N);
	str+=")";
	return str;	
}
string fS(int i){
	if(i==1)//结束递归的标志
	{
		string s="sin(1)+";
		s+=(n+'0');
		return s;
	}
	string str="(";
	str+=fS(i-1);
	str+=")";
	str+=fA(1,i);
	str+="+";
	str+=(n-i+1+'0');	
	return str;
}

int main(){	
	cin>>n;
	cout<<fS(n);
} 
发布了247 篇原创文章 · 获赞 53 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_42391248/article/details/104709817