A
使用递归编写一个程序,求:``S(n)=1-1/2+1/3-1/4+1/5-1/6+…
import java.util.Scanner;
public class Main {
public static double sum(int n) {
double s=0;
if(n==1) {
return 1;
}
else if(n%2==0) {
return sum(n-1)-(1.0/n);
}else {
return 1.0/n+sum(n-1);
}
}
public static void main(String[] args) {
Main a=new Main();
Scanner scanner =new Scanner(System.in);
while(scanner.hasNext()) {
int x=0;
x=scanner.nextInt();
double r;
r=sum(x);
System.out.printf("%.6f",r);
System.out.println();
}
}
}
B
使用递归编写一个程序,逆序输出一个非负整数。例如输入1234,输出4321(不含前导0)。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n;
Scanner in = new Scanner(System.in);
while (in.hasNext()){
n = in.nextInt();
if(n==0){
System.out.println(n);
continue;
} else if(n > 0){
while(n%10==0){
n = n/10;
}
System.out.println(f(n));
}
}
}
public static int f(int n){
if(n >= 10){
System.out.print(n % 10);
n = n/10;
return f(n);
}else {
return n % 10;
}
}
}
这个题目要注意的地方在于比如1200,只能输出21,要将后面的0全部去掉
C
编写一个递归程序,返回一个字符串中大写字母的数目。例如,输入“AbcD”,输出2。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(in.hasNext()){
String s=in.next();
char [] a=s.toCharArray();
int l=a.length;
int c=f(a,l-1);
System.out.println(c);
}
}
public static int f(char[]a,int i){
if(i==-1){
return 0;
}
else{
if(a[i]<='Z'&&a[i]>='A')
return 1+f(a,i-1);
else return f(a,i-1);
}
}
}
D
Kimi最近在研究一个数列:
- F(0) = 7
- F(1) = 11
- F(n) = F(n-1) + F(n-2) (n≥2)
Kimi称之为Kimi数列。请你帮忙确认一下数列中第n个数是否是3的倍数。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(in.hasNext()){
int n=in.nextInt();
int r=f(n);
if(r%3==0)
System.out.println("Yes");
else
System.out.println("No");
}
}
public static int f(int n){
if(n==0)
return 7;
else if(n==1)
return 11;
else return f(n-1)+f(n-2);
}
}
E
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(in.hasNext()){
int n=in.nextInt();
int m=in.nextInt();
int r=f(n,m);
System.out.println(r);
}
}
public static int f(int a,int b){
if(a==(b-1)){
return 1;
}
else if(a==(b-2)){
return 2;}
else return f(a,b-1)+f(a,b-2);
}
}
F
用大小为1×2的骨牌铺满一个大小为2×n的长方形方格,编写一个程序,输入n,输出铺放方案总数。例如,输入n=3,即大小为2×3的方格,输出3。3种骨牌铺放方案如下图所示:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(in.hasNext()){
int n=in.nextInt();
int r=f(n);
System.out.println(r);
}
}
public static int f(int a){
if(a==1){
return 1;
}
else if(a==2){
return 2;}
else return f(a-1)+f(a-2);
}
}