蓝桥杯练习题——Sine之舞

蓝桥杯练习题——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,一个是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;
    }
}

本篇结束!!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41718454/article/details/105550136