基础训练8-递归、递推

递归、递推


问题描述

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。

通过观察规律,我写出了An的前5项:

从我们写出的结果可以看到,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;
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值