一、使用计算机计算组合数
1)使用组合数公式利用n!来计算
a,思想:利用n!计算 先算n!,k!,(n-k)!
b,程序流程图:
c,源代码:
import java.math.BigInteger; import java.util.Scanner; public class zuhe { /** * @param args */ public static void main(String[] args) { Scanner scanner=new Scanner(System.in); System.out.print("请输入n:"); int num1=scanner.nextInt(); System.out.print("请输入k:"); int num2=scanner.nextInt(); BigInteger C,n,k,nk; n=calculate(num1); k=calculate(num2); nk=calculate(num1-num2); C=n.divide(k.multiply(nk)); System.out.println("Cn^k="+C); } public static BigInteger calculate(int n) { if(n==1 || n==0){ return BigInteger.valueOf(1); } return BigInteger.valueOf(n).multiply(calculate((n-1))); } }
d,结果:
2)使用递推的方法用杨辉三角形计算
a,思想:利用杨辉三角,找到对应位置,即结果。
b,流程图:
c,源代码:
import java.util.Scanner; public class yang { public static void main(String[] args) { System.out.print("请输入n:"); Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); System.out.print("请输入k:"); int k=scanner.nextInt(); int num[][]=new int[n+1][n+1]; System.out.print("Cn^k="+jisuan(n,k, num)); } private static int jisuan(int n, int k,int num[][]) { int i,j; for(i=0;i<=n;i++){ num[i][i]=1; num[i][0]=1; } for(i=2;i<=n;i++){ for(j=1;j<i;j++){ num[i][j]=num[i-1][j-1]+num[i-1][j]; } } return num[n][k]; } }
d,结果:
3)使用递归的方法用组合数递推公式计算
a,思想:通过组合数数据规律,利用递归解决。
b,流程图:
c,源代码:
import java.util.Scanner; public class zuhe { public static void main(String[] args) { System.out.print("请输入n:"); Scanner input = new Scanner(System.in); int n = input.nextInt(); System.out.print("请输入k:"); int k = input.nextInt(); System.out.print("Cn^k= "+jisuan(n,k)); } public static long jisuan(int m,int n) { if(m == n || n == 0) return 1; else{ return jisuan(m - 1,n - 1)+jisuan(m - 1,n); } } }
d,结果:
二、递归编程解决汉诺塔问题
a,思想:(1)n-1 A-->B
(2)n A-->C
(3)n-1 B-->C (1)(3)通过递归循环实现
b,流程图:
c,源代码:
import java.util.Scanner; public class ta { public static void main(String[] args) { System.out.print("请输入盘子的个数:"); Scanner input = new Scanner(System.in); int pan = input.nextInt(); System.out.println("挪动这"+pan+"盘子的步骤为:"); hanoi(pan, 'A', 'B', 'C'); } public static void hanoi(int n,char a,char b,char c) { if(n == 1) { move(a,c); } else { hanoi(n-1,a,c,b); move(a,c); hanoi(n-1,b,a,c); } } public static void move(char a, char c) { System.out.println(a+"-->"+c); } }
d,结果
三、使用递归方式判断某个字串是否是回文
a,思想:判断头尾字符是否相等,利用递归一次向中间推进。
b,流程图:
c,源代码:
import java.util.Scanner; public class huiwen { public static void main(String[] args) { System.out.print("请输入要判断的字符串:"); Scanner input = new Scanner(System.in); String in = input.next(); int pre = 0,end = in.length() - 1; if(panduan(in,pre,end)) System.out.println(in+"是回文字符串!"); else System.out.println(in+"不是回文字符串!"); } public static boolean panduan(String in,int pre, int end) { if(pre >= end) return true; else { if(in.charAt(pre) == in.charAt(end)) return panduan(in,pre+1,end-1); else return false; } } }
d,结果: