1.(1)使用组合数公式利用n!来计算
设计思想:利用递归法求阶乘,利用公式即可求得组合数的计算结果
import java.util.*;
public class CombinationNumber {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.print("请输入组合数下标n:");
int n = in.nextInt();
System.out.print("请输入组合数上标k:");
int k = in.nextInt();
int C = Jiecheng(n)/(Jiecheng(k)*Jiecheng(n - k));
System.out.println("C(n,k) = "+C);
}
public static int Jiecheng(int n)//递归法计算阶乘
{
int s = 0;
if(n < 0)
System.out.println("Error!");
else if(n == 1||n == 0)
s = 1;
else
s = n * Jiecheng(n -1);
return s;
}
}
(2)使用递推的方法用杨辉三角形计算
设计思想:利用for循环逐步求得组合数结果。
import java.util.Scanner;
public class Combination2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.print("请输入组合数下标n:");
int n = in.nextInt();
System.out.print("请输入组合数上标k:");
int k = in.nextInt();
int C = CombinationNumber(n,k);
System.out.println("C(n,k) = "+C);
}
public static int CombinationNumber(int n,int k)
{
if(k == 0||n == k) return 1;
int s=Math.min(k,n-k);
int p = 1,q = 0;
for(int i = 1; i <= s; i++)//递推计算
{
q = p * (n-i+1)/(i);
p = q;
}
return q;
}
}
(3)使用递归的方法用组合数递推公式计算
设计思想:利用递推公式,递归方式求得;注意结束条件。
import java.util.Scanner;
public class Combination3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.print("请输入组合数下标n:");
int n = in.nextInt();
System.out.print("请输入组合数上标k:");
int k = in.nextInt();
int C = CombinationNumber(n,k);
System.out.println("C(n,k) = "+C);
}
public static int CombinationNumber(int n,int k)//递归法计算组合数
{
int c = 0;
if(n == 1||k == 0||n == k)
c = 1;
else
c = CombinationNumber(n - 1,k - 1) + CombinationNumber(n - 1,k);
return c;
}
}
2.递归编程解决汉诺塔问题
设计思想:当A塔上有n个盘子时,先将A塔上编号 1 至 n-1 的盘子移动到B塔上(借助C塔),然后将A塔上n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A塔移动到C塔上。即用递归实现,结束条件是 n=1 时只需直接移动;遇到的问题:如何递归实现。
import java.util.*;
public class TowersOfHanoi2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.print("请输入盘子个数:");//盘子从上至下编号从1到n
int p = in.nextInt();
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
Hanoi(p,ch1,ch2,ch3);//最终实现1到n个盘子从A柱移到C柱
}
public static void move(int n,char from,char to)
{
System.out.printf( "将%d号盘子%c --> %c
",n,from,to);
}
public static void Hanoi(int n,char from,char mid,char to)
{
if(n == 1)
move(1,from,to);//结束条件,当n = 1时移动一次即可
else
{Hanoi(n-1,from,to,mid);//将n-1个盘子从A移到B
move(n,from,to);//将n个盘子移到C
Hanoi(n-1,mid,from,to);//将n-1个盘子从B移到C
}
}
}
3.使用递归方式判断某个字串是否是回文
设计思想:将输入的字符串转化为数组形式储存才能方便比较(利用 toCharArray() 函数)
import java.util.*;
public class Palindrome {
public static void main(String[] args) {
// TODO Auto-generated method stub
String temp = "";
char[] a;
Scanner in = new Scanner(System.in);
System.out.print("请输入要判断的字符串:");
String str = in.next();
a = str.toCharArray();//将字符串对象中的字符转换为一个字符数组
for(int i = a.length - 1;i >= 0;i--)//将字符串逆置
{
temp += a[i];
}
if(str.equals(temp))
System.out.println(str+"是回文数!");
else
System.out.println(str+"不是回文数!");
}
}