好久沒做藍橋杯的訓練了,昨天做一道今天更一篇
問題
問題描述
最近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,一個是Sn。
在整理遞推公式的時候,我發現An的與An-1之間存在某種關係,但是在用字符串表示的時候,結尾的括號總是很礙事。想要完整的寫遞推公式的話還要定一個指針,因爲是An是從An-1中間插入的。
那麼就先把擴回去掉,在全部生成後根據n來加上)就可以了。
A1=sin(1
A2=sin(1-sin(2
A3=sin(1-sin(2+sin(3
這樣遞推就得到了遞推公式(不會用LaTeX,只能手畫,見諒,畫圖工具是真的不好用)
然後在結尾填上**n個)**就得到了An。
Sn同理,Sn是先將開頭的多個括號去掉,就不用從中間插入了,方便找遞推公式。
這裏有個細節,就是在Sn中An後面會跟一個數字n0,n0與n在變化趨勢上呈相反關係,即隨着遞歸的深入,n是n–>1,而n0是1–>n,所以遞歸方法上還需要一個變量來存儲n0。
這樣就得到了兩個完整的遞推公式了。
代碼
import java.io.BufferedInputStream;
import java.util.Scanner;
/**
* @ClassName TeachCowsMath
* @Description Sine之舞
* @author 滑技工廠 https://blog.csdn.net/qq_41718454
* @date 2020/4/2
* @version 1.0
*/
public class TeachCowsMath {
static final String sin = "sin(";
public static void main(String[] args) {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
int N = sc.nextInt();
// String an = An2(N);
// System.out.println(an);
String sn = "";
for (int i = 1; i < N; i++) {
sn += "(";
}
sn += Sn(N, 1);
System.out.println(sn);
}
/*
* @Title An
* @Description 返回An (沒有結尾括號)
* @author 滑技工廠
* @Date 2020/4/15
* @param [n]
* @return java.lang.String
* @throws
*/
public static String An(int n) {
if (n == 1)
return sin + "1";
return n % 2 == 0 ? An(n - 1) + "-" + sin + n : An(n - 1) + "+" + sin + n;
}
/*
* @Title An2
* @Description 返回An 有結尾括號的
* @author 滑技工廠
* @Date 2020/4/15
* @param [n]
* @return java.lang.String
* @throws
*/
public static String An2(int n) {
String an = An(n);
for (int i = 0; i < n; i++) {
an += ")";
}
return an;
}
/*
* @Title Sn
* @Description 返回Sn 沒有開頭括號
* @author 滑技工廠
* @Date 2020/4/15
* @param [n, n1是An後面加的那個數,與n的變化相反]
* @return java.lang.String
* @throws
*/
public static String Sn(int n, int n1) {
return n == 1 ? An2(n) + "+" + n1 : Sn(n - 1, n1 + 1) + ")" + An2(n) + "+" + n1;
}
}
本篇結束!!