【蓝桥杯】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=sin(1–sin(2+sin(3–sin(4+…sin(n))…)
Sn=(…(A1+n)A2+n-1)A3+…+2)An+1
这两个式子其实的递归是不同的
可以看出An的递归是终止在n
Sn终止在1,所以求An应该多一个辅助量,但是在求Sn的时候会用到求An所以在Sn中还是需要加如辅助变量

代码


import java.util.Scanner;

class Main {
	public static void printA(int i, int k) {
		if (i == k)
			System.out.printf("sin(%d)", k);
		else {
			System.out.printf("sin(%d", i);
			System.out.print(i % 2 == 0 ? "+" : "-");
			printA(i + 1, k);
			System.out.print(")");
		}
	}

	public static void printB(int i, int k) {
		if (i == 1) {
			printA(1, 1);
			System.out.print("+" + k);
		} else {
			System.out.print("(");
			printB(i - 1, k);
			System.out.print(")");
			printA(1, i);
			System.out.print("+" + (k + 1 - i));
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		printB(n, n);
	}

}

发布了81 篇原创文章 · 获赞 515 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/i6223671/article/details/104399777