方法课后作业
1、使用计算机计算组合数
(1)使用组合数公式利用n!来计算
源代码:
1 import javax.swing.JOptionPane; 2 public class Yang1 { 3 public static void main(String[] args){ 4 int n,k; 5 String s=JOptionPane.showInputDialog("请输入一个正整数作为n(n>k):"); 6 n=Integer.parseInt(s); 7 String s1=JOptionPane.showInputDialog("请输入一个正整数作为k:"); 8 k=Integer.parseInt(s1); 9 JOptionPane.showMessageDialog( null, zuheshu(k,n),"在n个元素中选取k个组合的所有结果数",JOptionPane.INFORMATION_MESSAGE ); 10 } 11 public static long zuheshu(int k,int n){ 12 long i; 13 i=jiecheng(n)/(jiecheng(k)*jiecheng(n-k)); 14 return i; 15 } 16 public static long jiecheng(int i){ 17 long j=1; 18 if(i!=1) 19 j=i*jiecheng(i-1); 20 else 21 i=1; 22 return j; 23 } 24 }
结果截图:
(2)使用递推的方法用杨辉三角形计算
源代码:
1 import javax.swing.JOptionPane; 2 public class Yang2 { 3 4 public static void main(String[] args) { 5 String firstnumber=JOptionPane.showInputDialog( "请输入第一个数" ); 6 String secondnumber=JOptionPane.showInputDialog( "请输入第二个数" ); 7 int number1 = Integer.parseInt( firstnumber ); 8 int number2 = Integer.parseInt( secondnumber ); 9 int max; 10 int min; 11 if(number1>number2) 12 { 13 min=number2; 14 max=number1; 15 } 16 else 17 { 18 max=number2; 19 min=number1; 20 } 21 int get=crule(max,min); 22 String output="组合数C["+max+"]["+min+"]最终的结果为:"; 23 output+=get; 24 JOptionPane.showMessageDialog(null, output, 25 "结果如下:", 26 JOptionPane.INFORMATION_MESSAGE ); 27 28 } 29 public static int crule(int number1,int number2){ 30 if(number2==0||number2==number1) 31 { 32 return 1; 33 } 34 else 35 { 36 return crule(number1-1,number2-1)+crule(number1-1,number2); 37 } 38 } 39 40 }
结果截图:
(3)使用递归的方法用组合数递推公式计算
源代码:
1 import javax.swing.JOptionPane; 2 public class Yang3 { 3 public static void main(){ 4 int n,k; 5 String s=JOptionPane.showInputDialog("请输入一个正整数作为n"); 6 n=Integer.parseInt(s); 7 String s1=JOptionPane.showInputDialog("请输入一个正整数作为k"); 8 k=Integer.parseInt(s1); 9 JOptionPane.showMessageDialog( null, digui(k,n),"在n个元素中选取k个组合的所有结果数",JOptionPane.INFORMATION_MESSAGE ); 10 } 11 public static long digui(int k,int n){ 12 long j=0; 13 if(k!=1) 14 j=digui(k-1,n)+digui(k,n); 15 else 16 return n; 17 return j; 18 } 19 }
结果截图:
2、汉诺塔问题
源代码:
1 // 汉诺塔问题 2 public class Hanoi 3 { 4 // recursively move disks between towers 5 public static void solveTowers( int disks, int sourcePeg, int destinationPeg, int tempPeg ) //disks:盘子 sourcePeg:来源管 destinationPeg:目标管 tempPeg:暂时管 6 { 7 8 if ( disks == 1 ) 9 { 10 System.out.printf( "\n%d --> %d", sourcePeg, destinationPeg ); 11 return; 12 } 13 14 solveTowers( disks - 1, sourcePeg, tempPeg, destinationPeg ); 15 16 // move last disk from sourcePeg to destinationPeg 17 System.out.printf( "\n%d --> %d", sourcePeg, destinationPeg ); 18 19 // move ( disks - 1 ) disks from tempPeg to destinationPeg 20 solveTowers( disks - 1, tempPeg, destinationPeg, sourcePeg ); 21 } 22 23 public static void main( String[] args ) 24 { 25 int startPeg = 1; // value 1 used to indicate startPeg in output 26 int endPeg = 3; // value 3 used to indicate endPeg in output 27 int tempPeg = 2; // value 2 used to indicate tempPeg in output 28 int totalDisks = 3; // number of disks 29 30 // initial nonrecursive call: move all disks. 31 solveTowers( totalDisks, startPeg, endPeg, tempPeg ); 32 } 33 }
结果截图:
解释:
如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘子,就将B当作辅助柱。
如果盘数超过2个,将最后一个盘子遮起来,就很简单了,每次处理两个盘子,也就是:A->B、A ->C、B->C这三个步骤,而被遮住的部份,其实就是进入程序的递回处理。
3、使用递归方式判断某个字串是否是回文( palindrome )
源代码:
1 import javax.swing.JOptionPane; 2 public class HuiWen { 3 4 public static void main(String[] args){ 5 String test=JOptionPane.showInputDialog( "请输入需要判断的字符串:" ); 6 int i = 0; 7 int j = test.length() - 1; 8 String output1=" "; 9 if(isPalindrome(test, i, j)) 10 { 11 output1="是回文数"; 12 } 13 else 14 { 15 output1="不是回文数"; 16 } 17 String output= test +output1; 18 JOptionPane.showMessageDialog(null, output, 19 "结果如下:", 20 JOptionPane.INFORMATION_MESSAGE ); 21 22 } 23 //判断是否是回文字符串的方法: 24 public static boolean isPalindrome(String s,int i,int j){ 25 if(i > j) 26 throw new IllegalArgumentException(); 27 if(i == j) 28 return true; 29 else{ 30 return (s.charAt(i) == s.charAt(j)) && isPalindrome(s,i+1,j-1); 31 } 32 } 33 34 }
结果截图: