关于松鼠的游戏 java_【蓝桥杯】基础练习 Sine之舞 Java语言

问题描述

最近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)…)…))

517f523949f874e2f0af21bafb3ffe51.png

奇-偶+,直到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);

}

}

def4ebcd5877f117d143985eb5ff06e6.png

递推和递归傻傻分不清,查了一下https://www.zhihu.com/question/20651054

递推:从初值出发反复进行某一运算得到所需结果。-----从已知到未知

递归:从所需结果出发不断回溯前一运算直到回到初值再递推得到所需结果----从未知到已知

我是这么理解的,递推是从1往n推,推出去,方向向外。递归是从n回到1,归结回来,方向向内。递推和递归都是Recursion,做题思考都ok的话,也不用太纠结名称?到时候自然而然就清楚了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值