递归、递推
问题描述
FJ在沙盘上写了这样一些字符串:
A1 = “A”
A2 = “ABA”
A3 = “ABACABA”
A4 = “ABACABADABACABA”
… …
你能找出其中的规律并写所有的数列AN吗?
输入格式
仅有一个数:N ≤ 26。
输出格式
请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
ABACABA
首先观察规律,我们发现 A1 = “A”,而A2 = A1”B”A1, 而 A3= A2”C”A2…依次类推,A26 = A25”Z”A25。而A1的1代表该字符串中有新字母A出现,而A2则代表该字符串中有新字母B出现,以此类推,26则有新字母Z出现。从我们发现的规律来看,后一项的值与前一项的值有关,而后后一项的值与后一项的值有关,所以,我们应该使用递归。
那么这个递归,到底该怎么递归呢??
根据数模限制,我们用一个字符数组来存储26个字母
import java.util.Scanner;
public class Main{
static char[] letter = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'S', 'Y', 'Z' };
public static char printChar(int n){
for (int i = n; i > 0; i--)
System.out.print(printChar(i - 1));
return letter[n];
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.close();
printChar(n);
}
}
问题描述
最近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,之后才能算出Sn。
从我们写出的结果可以看到,sin里面的数字是从1开始递增的,不过要注意的是,负号 – 和加号 + 交错出现。所以我们要加一个模(%)的判定,一次输出 + 号,下一次输出 - 号。
而且,我们还发现,A2包含A1的一部分,而A3又包含A2的一部分,以此类推,An包含An-1的一部分。我们就很容易联想到一种算法:递归算法。
而Sn的计算方法跟计算An的方法类似,下面看完整代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String string = f(n, 1, 1);
System.out.println(string);
}
private static String f1(int n, int i, int j) {
if (i == n)
return "sin(" + j + ")";
if (i % 2 == 0)
return "sin(" + i + "+" + f1(n, i + 1, j + 1) + ")";
else
return "sin(" + i + "-" + f1(n, i + 1, j + 1) + ")";
}
private static String f(int n, int i, int j) {
if (i == n)
return f1(n, i, j) + "+" + i;
return "(" + f(n, i + 1, j) + ")" + f1(n, i, j) + "+" + i;
}
}