藍橋杯練習題——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;
    }
}

本篇結束!!

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章