一.使用组合数公式利用n!来计算
1.程序设计思想
(1)用户输入n和k的值。
(2)判断n是否大于等于k,若是,继续运行程序,否则结束程序。
(3)调用计算阶乘的方法,在此方法中,若输入的数字为0或1,返回1;若不是,则用递归的方法重复调用此方法计算阶乘。
2.程序流程图
3.源代码
import java.util.Scanner;
public class digui {
public static int jiecheng(int x)
{
int y=1;
if(x==1||x==0)
y=1;
else y=jiecheng(x-1)*x;
return y;
}
public static void main(String args[]) {
int n ,k,c;
Scanner in=new Scanner(System.in);
System.out.print("输入从n个数中选k个数中n,k的值:");
n=in.nextInt();
k=in.nextInt();
System.out.println("结果为:");
c=jiecheng(n)/(jiecheng(k)*jiecheng(n-k));
System.out.println(c);
}
}
4.实验结果截图
二. 使用递推的方法用杨辉三角形计算
1.程序设计思想
(1)用户输入组合数的n和k。
(2)定义一个(n+1)*(n+1)的二维数组用来放杨辉三角的数值。
(3)利用循环嵌套完成杨辉三角中每个位置数值的计算。先为每一行赋值,每行的第一个数和最后一个数均为1,其余位置为上一行的第k-1和k个数的和,然后为下一行赋值。
(4)输出指定位置的数值。
2.程序流程图
3.程序源码
import java.util.Scanner;
public class yang {
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
System.out.print("输入N值:");
int n=sc.nextInt();
System.out.print("输入K值:");
int k=sc.nextInt();
int[][] a=new int[n+1][n+1];
for(int i=0;i<n+1;i++)
{
for(int j=0;j<=i;j++) {
if(j==0||j==i)
{
a[i][j]=1;
System.out.print(a[i][j]+" ");
}
else
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
System.out.print(a[i][j]);
System.out.print(" ");
}
}
System.out.println();
}
if(n<2||k==1)
System.out.println("num=1");
else System.out.println("num="+a[n][k-1]+"="+a[n-1][k-2]+"+"+a[n-1][k-1]);
}
}
4.实验结果截图
三.使用递归的方法用组合数递推公式计算
1.程序设计思想
(1)提示用户输入组合数中n和k的值。
(2)判断n和k是否合法,若不合法,则结束程序;合法,继续程序。
(3)定义计算组合数的方法。如果输入的k=0或n,则 =1;如果k=1,则其他情况则根据公式 计算。
(4)输出结果并结束程序。
2.程序流程图
3.程序源码
public class ditui2 {
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
System.out.print("输入N值:");
int n=sc.nextInt();
System.out.print("输入K值:");
int k=sc.nextInt();
System.out.println("结果为:"+C(n,k));
}
public static int C(int n,int k)
{
if(n<0||k<0||n<k)
return 0;
if(n==k)
return 1;
if(k==1)
return n;
return C(n-1,k)+C(n-1,k-1);
}
}
四.递归编程解决汉诺塔问题
1. 程序设计思想
(1)提示用户输入盘子数量。
(2)调用方法解决汉诺塔问题。
将n个盘子从第一根柱子移到第三根柱子上的方法为:①先将n-1个盘子借助第三根柱子移到第二根柱子上。②再将第一根柱子上的最大的盘子移到第三根柱子上。③然后将第二根柱子上的n-1个盘子借助第一根柱子移到第三根柱子上。
将n-1个盘子从第二根柱子上移到第三根柱子上的方法为:①先将n-2个盘子借助第三根柱子移到第一根柱子上②再将第二根柱子上的最大的盘子移到第三根柱子上。③然后将第一根柱子上的n-2个盘子借助第二根柱子移到第三根柱子上。
而移动n-2个盘子的方法又类似于移动n个盘子的方法,以此类推。上述的第一、二、三根柱子可视为初始柱、过渡柱以及目标柱。移动n个盘子三步可视为:①将n-1个盘子由初始柱借助目标柱移到过渡柱。②将初始柱上的最大的盘子直接移到目标柱。③将n-1个盘子由过渡柱借助初始柱移到目标柱。借助递归的方法可解决汉诺塔的问题。
(3)在方法中,先判断盘子数量是否为1,若为1,则直接将第一根柱子上的盘子移到第三根上;否则,先将n-1个盘子移动到过渡柱上,再将初始柱上的盘子移到目标柱上,再将n-1个盘子由过渡柱移到目标柱上。递归调用该方法,每次调用移动的盘子是上一次减一个。
(4) 直到算出结果,将结果显示在屏幕,程序结束。
2.程序设计流程
3.程序源码
import java.util.*;
public class HanoiTower {
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner sc=new Scanner(System.in);
int n;
System.out.println("Please enter the number of your dished(Hanoi Tower):");
n=sc.nextInt();
System.out.println("The number of the times you need to move the dishes is:"+new HanoiTower().hanoiTower(n));
HanoiTower HanoiTower = new HanoiTower();
HanoiTower.move(n, 'A', 'B', 'C');
}
public int hanoiTower(int n) {
if(n==1) return 1;
else return hanoiTower(n-1)*2+1;
}
public void move(int n, char a, char b, char c) {
if (n == 1)
System.out.println("盘 " + n + " 由 " + a + " 移至 " + c);
else {
move(n - 1, a, c, b);
System.out.println("盘 " + n + " 由 " + a + " 移至 " + c);
move(n - 1, b, a, c);
}
}
}
4.结果截图
五.使用递归方式判断某个字串是否回文
1. 程序设计思想
(1)提示用户输入字符串。
(2)将字符串类型数据转成字符数组便于比较对称位置上的字符。
(3)定义判断是否是回文的方法,参数为每次要判断的字符的位置。若字符的位置超过字符数组的的一半,说明字符串为回文;判断一对对称位置上的字符是否一致,若一致则判断下一对对称位置上的字符是否一致,如不一致则不是回文。
(4)在主函数中调用判断是否一个字符串是否为回文的方法,因为在数组中一个元素下标为0,所以调用时参数应为0,并做相应输出。
2.程序流程图
3.实验源码
import java.util.Scanner;
public class huiwen
{
private static int len;
private static char p[];
System.out.println(" 请输入要判断的字符串");
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
String str;
str=sc.nextLine();
len=str.length();
p=str.toCharArray();
if(huiwen(0))
System.out.println(str+" 是回文!");
else System.out.println(str+" 不是回文!");
}
public static boolean huiwen(int n){
if(n>=len/2)
return true;
if(p[n]==p[len-1-n])
return huiwen(n+1);
else return false;
}
}
4.结果截图