课后作业1:
1.程序设计思想
第一种用公式的方法求组合数,利用递归方法,求出阶乘,求出组合数的大小。
第二种是用递推的方法,递推的方法是由前往后递推,利用杨辉三角形找出规律,利用二元数组求出组合数的大小。
第三种是用递归函数的方法,由后往前调用递归公式,利用给出组合数公式,初始化值,求出组合数的大小
2.程序流程图
3.程序源代码
第一种:
import java.util.Scanner;
import java.lang.Math.*; import java.math.BigInteger; public class ZuheNumber{ //组合数公式 public static BigInteger jiecheng(int n) { if(n<0) { System.out.println("输入有误"); } if(n==1||n==0) { return BigInteger.valueOf(1); } else { return BigInteger.valueOf(n).multiply(jiecheng((n-1))); } } public static long calculateN(int n) { if(n==1 || n==0){ return 1; } return n*calculateN(n-1); }public static void main(String args[])
{ System.out.print("请输入组合数的n和k:"); Scanner scanner1=new Scanner(System.in);//组合数的下标 int n=scanner1.nextInt(); Scanner scanner2=new Scanner(System.in);//组合数的上标 int k=scanner2.nextInt(); BigInteger x,y,z,d,result; x=jiecheng(n); y=jiecheng(k); z=jiecheng(n-k); d=y.multiply(z);//计算k!*(n-k)!的结果 result=x.divide(d);//计算n!/(k!*(n-k)!)的结果 System.out.println("组合数的结果是:"+result);//输出运算结果}
}第二种:
import java.util.Scanner;
import java.lang.Math.*; public class ZuheNumber1 { public static int n; public static int k; public static int c[][]=new int[100][100]; ZuheNumber a=new ZuheNumber(); public static void main(String args[]) { System.out.print("请输入组合数的n和k:"); Scanner scanner1=new Scanner(System.in);//组合数的下标 int n=scanner1.nextInt(); Scanner scanner2=new Scanner(System.in);//组合数的上标 int k=scanner2.nextInt(); c[0][0]=1;//初始化 c[1][0]=1;//初始化 c[1][1]=1;//初始化 for(int i=2;i<=n;i++) { c[i][0]=1; c[i][i]=1;//初始化每行 杨辉三角的两边的值 for(int j=1;j<=i;j++) { c[i][j]=c[i-1][j-1]+c[i-1][j]; } } System.out.println("组合数的结果是:"+c[n][k]); } }第三种:
import java.util.Scanner;
public class ZuheNumber2 { public static int n; public static int k; public static int c[][]=new int[100][100]; public static void main(String args[]) { System.out.print("请输入组合数的n和k:"); Scanner scanner1=new Scanner(System.in);//组合数的下标 int n=scanner1.nextInt(); Scanner scanner2=new Scanner(System.in);//组合数的上标 int k=scanner2.nextInt(); c[0][0]=1;//初始化 c[1][0]=1;//初始化 c[1][1]=1;//初始化 System.out.println("组合数的结果是:"+digui(n,k)); } public static int digui(int n0,int k0) { if((k0==n0)||(k0==0)) { return 1; } c[n0][k0]=digui(n0-1,k0)+digui(n0-1,k0-1); return c[n0][k0]; } }第一种截图:
第二种截图:
第三种截图:
课后作业2:
程序设计思想: 递归编程解决汉诺塔问题。用Java实现
程序流程图:
源代码:
import java.util.*;public class HanoiTower {
public static void main(String[] args) {
// TODO Auto-generated method stub@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));}
public int hanoiTower(int n){if(n==1) return 1;else return hanoiTower(n-1)*2+1;}}
程序截图:
课后作业3:
程序设计思想:使用递归方式判断某个字串是否是回文( palindrome )
程序流程图:
源代码:
//Li Cuiyun,October 14,2016.
//用递归方法编程解决汉诺塔问题package tutorial_3_5;import java.util.*;public class HanoiTower {
public static void main(String[] args) {
// TODO Auto-generated method stub@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));}
public int hanoiTower(int n){if(n==1) return 1;else return hanoiTower(n-1)*2+1;}}
程序截图: