课后作业1:组合数
1)程序设计思想
若使用组合数公式计算C(n,k)需要n!使用,计算n!使用递归算法BigInteger calculateN(int n);
若使用递推的方法计算,则需要明白杨辉三角形与组合数的关系,则转化为杨辉三角形的计算,通过杨辉三角形的性质,a[i][j]=a[i-1][j-1]+a[i-1][j];
若使用递归的方法计算,则根据C(n+1,k)=C(n,k-1)+C(n,k)进行递归,需要注意的是进行要给足初始条件。
2)程序流程图
BigInteger CombineN(int n,int k)
BigInteger Combine(int n,int k);BigInteger calculateN(int n)
BigInteger CombineSanjiao(int n,int k)
3)源程序代码
1 package opinion; 2 import java.math.BigInteger; 3 import java.util.Scanner; 4 public class CombianNum { 5 public static BigInteger calculateN(int n) { 6 if(n==1 || n==0){ 7 return BigInteger.valueOf(1); 8 } 9 return BigInteger.valueOf(n).multiply(calculateN((n-1))); 10 } 11 public static BigInteger Combine(int n,int k) 12 { 13 return calculateN(n).divide(calculateN(k).multiply(calculateN(n-k))); 14 } 15 public static BigInteger CombineN(int n,int k) 16 { 17 if((n==k)||(n==1&&k==0)) 18 return BigInteger.valueOf(1); 19 else if(k==1) 20 return BigInteger.valueOf(n); 21 else 22 return CombineN(n-1,k-1).add(CombineN(n-1,k)); 23 } 24 public static BigInteger CombineSanjiao(int n,int k) 25 { 26 int [][]triangle=new int[100][100]; 27 int i,j; 28 for(i=0;i<n;i++) 29 { 30 triangle[i][i]=triangle[i][0]=1; 31 } 32 for(i=2;i<=n;i++) 33 { 34 for(j=1;j<=k;j++) 35 { 36 triangle[i][j]=triangle[i-1][j-1]+triangle[i-1][j]; 37 } 38 } 39 return BigInteger.valueOf(triangle[n][k]); 40 } 41 public static void main(String[] args) 42 { 43 Scanner scanner=new Scanner(System.in); 44 System.out.println("请输入组合数的上标"); 45 int under_num=scanner.nextInt(); 46 System.out.println("请输入组合数的下标"); 47 int beside_num=scanner.nextInt(); 48 System.out.println("使用递归方法得该组合数结果为"+CombineN(beside_num,under_num));//由后至前 49 System.out.println("使用公式法得该组合数结果为"+Combine(beside_num,under_num)); 50 System.out.println("使用递推方法得该组合数结果为"+CombineSanjiao(beside_num,under_num)); 51 } 52 }
4)结果截图
课后作业2(递归编程解决汉诺塔问题)
1)程序设计思想
将n个盘子从A座移到C盘可以分解为以下3个步骤:
(1)将A上的n-1个盘借助C座先移到B座上;
(2)把A座上剩下的一个盘移到C盘上;
(3)将n-1个盘从B盘借助于A座移到C座;
2)程序流程图
void hanoi(int n,char one,char two,char three)
void move(char x,char y)
3)源程序代码
1 package opinion; 2 import java.util.*; 3 public class Hanoi { 4 public static void main(String []args) 5 { 6 Scanner scanner=new Scanner(System.in); 7 System.out.println("input the number of diskes:"); 8 int num=scanner.nextInt(); 9 System.out.println("The step to move "+num+" diskes"); 10 hanoi(num,'A','B','C'); 11 } 12 public static void hanoi(int n,char one,char two,char three) 13 { 14 if(n==1) 15 move(one,three); 16 else 17 { 18 hanoi(n-1,one,three,two); 19 move(one,three); 20 hanoi(n-1,two,one,three); 21 } 22 } 23 public static void move(char x,char y) 24 { 25 System.out.println(x+"->"+y); 26 } 27 }
4)结果截图
课后作业3(使用递归方式判断某个字串是否是回文)
1)程序设计思想
当字符串为空或者单个字符时,根据字符串长度,判断首尾是否相等,若相等再通过递归,截取下一个字符串,再进行验证,最后输出字符串是为回文。当中某一对不相等,则不是回文。
2)程序流程图
int Plength(String str)
3)源程序代码
1 package opinion; 2 import java.util.*; 3 public class Palindsome { 4 5 public static void main(String []args) 6 { 7 Scanner scanner=new Scanner(System.in); 8 System.out.println("请输入字符串"); 9 String s=scanner.nextLine(); 10 if(Plength(s)==1) 11 System.out.println("这个字符串是回文"); 12 else 13 System.out.println("这个字符串不是回文"); 14 } 15 public static int Plength(String str) 16 { 17 if(str.length()==0||str.length()==1) 18 return 1; 19 else 20 { 21 char First=str.charAt(0); 22 char End=str.charAt(str.length()-1); 23 if(First!=End) 24 return 0; 25 } 26 return Plength(str.substring(1, str.length()-1));//截取字符串中的子串 27 } 28 }
4)结果截图