问题描述
最近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
思路
Sn 比较好写,找到递归关系和出口就行
Sn=(…(A1+n)A2+n-1)A3+…+2)An+1
S1 = A1+n
S2 = (A1+n)A2+n-2
Sn = (S(n-1))An+“n-”+(n-1)
An主要是思考切割方式,以及如何完成递推
A1 = sin(1)
A2 = sin(1– sin(2) )
A3 = sin(1–sin(2+sin(3)))
An = sin(1- sin(2+ sin(3- …sin(n)…)…))
奇-偶+,直到n
开始想的是A(n)在A(n-1)中括号前面插入sin(n),然后使用了StringBuilder的insert(index,str)方法,后来发现既然先传进去的是A(n),那么此时A(n-1)还没有值,也就不存在对应的index。
参考了http://www.manongjc.com/article/49220.html
想到,倒着推失败,那就顺着来(递推和递归傻傻分不清)
引入一个当前计数器,(还是不能太傻,只知道传一个参数)
if(cur == n) A(cur,n) = sin(n)
A(cur,n) = sin(cur- or sin(cur+ A(++cur;n)… )
cur++,会栈溢出,而且逻辑也不太正确,具体还不太清楚,也不知道咋解释。前置是先计算,后赋值。后置是先赋值,后计算。如果是后置传入的参数会重复两遍,但是为啥会栈溢出还没想明白。如果有大佬能够赐教一二,在下不胜感激。
代码和结果
import java.util.Scanner;
public class SineDance {
static String s1 = new String();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
s1 = Sn(n);
System.out.println(s1);
}
sc.close();
}
private static String An(int cur,int n) {
if(cur == n) return "sin("+n+")";
else {
if(cur % 2 == 0)
return "sin("+cur+"-"+An(++cur, n)+")";
else
return "sin("+cur+"+"+An(++cur, n)+")";
}
}
private static String Sn(int n) {
if(n ==1) return An(1,1)+"+"+n;
return "("+Sn(n-1)+")"+An(1,n)+"+"+"n-"+(n-1);
}
}
递推和递归傻傻分不清,查了一下https://www.zhihu.com/question/20651054
递推:从初值出发反复进行某一运算得到所需结果。-----从已知到未知
递归:从所需结果出发不断回溯前一运算直到回到初值再递推得到所需结果----从未知到已知
我是这么理解的,递推是从1往n推,推出去,方向向外。递归是从n回到1,归结回来,方向向内。递推和递归都是Recursion,做题思考都ok的话,也不用太纠结名称?到时候自然而然就清楚了。