1.题目描述
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
输入
多组数据输入,每组数据包含两个正整数a, b,且 a
输出
蜜蜂从蜂房a爬到蜂房b的可能路线数。
解题
方法一:直接相减,例如从5到7,用从1到7的路线数减去从1到5的路线图
方法二:转换成从蜂房1开始,例如从5到7转换成从1到3
//方法二解题代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int a = scanner.nextInt();
int b = scanner.nextInt();
int y=0,t = 0;
if(a>b){
t=a;
a=b;
b=t;
}
if(a==1){
y = fun(b);
}else{
y = fun(b-(a-1));
}
System.out.println(y);
}
}
public static int fun(int x){
if(x==1){
return 0;
}else if(x==2){
return 1;
}else if(x==3){
return 2;
}else{
return fun(x-1)+fun(x-2);
}
}
}
2.题目描述
编写一个程序,使用递归算法输出一个一维字符数组中所有字符的全排列,假设字符都不一样。例如{‘a’,‘b’,‘c’}的全排列为(a,b,c), (a,c,b), (b,a,c), (b,c,a), (c,a,b), (c,b,a)
import java.util.Scanner;
public class MainB {
public static void main(String[] args) {
char[] x ={'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z'};
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int n = scanner.nextInt();
if(n>=1&&n<=26){
fun(x,0,n);
}
System.out.println();//每组输出有空行
}
}
private static void fun(char[] x, int k, int n) {
char t;
if(k==n){
for(int i1=0;i1<n;i1++){
System.out.printf("%c",x[i1]);
}
System.out.println();
}else{
for(int i=k;i<n;i++){
t=x[i];
x[i]=x[k];
x[k]=t;//轮流做第k个
fun(x,k+1,n);//递归表达式
t=x[i];//位置复原
x[i]=x[k];
x[k]=t;
}
}
}
}
3.题目描述
使用递归编写一个程序,逆序输出一个正整数。例如输入1234,输出4321。
import java.util.Scanner;
public class MainC {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int n = scanner.nextInt();
if(n==0){
System.out.println(n);
}else{
while(true){
if(n%10==0){
n=n/10;
}else{
dao(n);
break;
}
}
}
}
}
public static void dao(int n){
System.out.printf("%d",n%10);
n=n/10;
if(n>0){
dao(n);
}else{
System.out.println();
}
}
}
4.题目描述
用大小为1×2的骨牌铺满一个大小为2×n的长方形方格,编写一个程序,输入n,输出铺放方案总数。例如,输入n=3,即大小为2×3的方格,输出3。3种骨牌铺放方案如下图所示:
import java.util.Scanner;
public class MainD {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int n = scanner.nextInt();
System.out.println(fun(n));
}
}
private static int fun(int n) {
if(n==1){
return 1;
}else if(n==2){
return 2;
}else{
return fun(n-1)+fun(n-2);
}
}
}
5.题目描述
使用递归编写一个程序实现汉诺塔问题,要求在输入圆盘数量之后,输出圆盘的移动步骤,输出格式示例如下:
第1步:1号盘从A柱移至B柱
第2步:2号盘从A柱移至C柱
import java.util.Scanner;
public class MainE {
static int step ;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
step=1;
int n = scanner.nextInt();
hanoi(n,"A","B","C");
System.out.println();//每组输出有一行空行
}
}
private static void hanoi(int n, String A, String B, String C) {
if(n>0){
hanoi(n-1,A,C,B);//借助C柱把n-1个盘子从A柱移到B柱
move(n,A,C); //把最后一个盘子从A柱移到C柱
hanoi(n-1,B,A,C);//把n-1个盘子借助A柱从B柱移到C柱
}
}
private static void move(int n, String A, String B) {
System.out.println("第"+step+++"步:"+n+"号盘从"+A+"柱移至"+B+"柱");
}
}
6.题目描述
一只超级青蛙一次可以跳上1级台阶,也可以跳上2级……它也能够跳上n级台阶。请问,该青蛙跳上一个n级的台阶总共有多少种跳法?
import java.util.Scanner;
public class MainF {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int x = scanner.nextInt();
int y = (int) Math.pow(2, x-1);
System.out.println(y);
}
}
}
7.题目描述
“汉诺塔”是一个众所周知的古老游戏。
现在我们把问题稍微改变一下:如果一共有4根柱子,而不是3根,那么至少需要移动盘子多少次,才能把所有的盘子从第1根柱子移动到第4根柱子上呢?
为了编程方便,您只需要输出这个结果mod 10000的值。
import java.util.Scanner;
public class MainG {
public static void main(String[] args) {
int x[] = new int[50001];
x[0]=0;
int a=1,b=a,k=1;
for(int i=1;i<x.length;i++){
x[i]=(x[i-1]+k)%10000;
b--;
if(b==0){
a++;
b=a;
k*=2;
k=k%10000;
}
}
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int n = scanner.nextInt();
if(n>0&&n<=50000){
System.out.println(x[n]);
}
}
}
}
参考博客https://blog.csdn.net/wsqgwp/article/details/9164399