第三讲课后题
第一题:利用杨辉三角形原理来计算组合数
共有三种方法:
第一种:运用n的阶乘计算组合数
1 package practice3; 2 //使用组合数公式利用n!来计算 3 //@吕鹏博 2016年10月15日20:14:49 4 import javax.swing.JOptionPane; 5 public class YanghuiDitui { 6 7 public static void main(String[] args) { 8 String firstnumber=JOptionPane.showInputDialog( "请输入第一个数" ); 9 String secondnumber=JOptionPane.showInputDialog( "请输入第二个数" ); 10 int number1 = Integer.parseInt( firstnumber ); 11 int number2 = Integer.parseInt( secondnumber ); 12 int max; 13 int min; 14 if(number1>number2) 15 { 16 min=number2; 17 max=number1; 18 } 19 else 20 { 21 max=number2; 22 min=number1; 23 } 24 int get=crule(min,max); 25 String output="组合数最终的结果为:"; 26 output+=get; 27 JOptionPane.showMessageDialog(null, output, 28 "结果如下:", 29 JOptionPane.INFORMATION_MESSAGE ); 30 31 } 32 public static int crule(int number1,int number2){ 33 int value; 34 value=jiecheng(number2)/(jiecheng(number1)*jiecheng(number2-number1)); 35 return value; 36 } 37 public static int jiecheng(int number1){ 38 if(number1==0||number1==1) 39 { 40 number1=1; 41 } 42 else 43 { 44 number1=number1*jiecheng(number1-1); 45 } 46 return number1; 47 } 48 49 }
第二种:使用递推的方法用杨辉三角形计算
1 package practice3; 2 //使用递推的方法用杨辉三角形计算 3 //@吕鹏博 2016年10月15日20:50:01 4 import javax.swing.JOptionPane; 5 public class Yanghui2 { 6 static int C[][] = new int[1 << 10][1 << 10]; 7 public static void main(String[] args) { 8 9 String firstnumber=JOptionPane.showInputDialog( "请输入第一个数" ); 10 String secondnumber=JOptionPane.showInputDialog( "请输入第二个数" ); 11 int number1 = Integer.parseInt( firstnumber ); 12 int number2 = Integer.parseInt( secondnumber ); 13 int max; 14 int min; 15 if(number1>number2) 16 { 17 min=number2; 18 max=number1; 19 } 20 else 21 { 22 max=number2; 23 min=number1; 24 } 25 C[0][0] = 1; 26 for (int i = 1; i <= max; i++) { 27 C[i][0] = 1; 28 C[i][i] = 1; 29 for (int j = 1; j <= min; j++) { 30 C[i][j] = C[i - 1][j - 1] + C[i - 1][j]; 31 } 32 } 33 String output="组合数C["+max+"]["+min+"]最终的结果为:"; 34 output+=C[max][min]; 35 JOptionPane.showMessageDialog(null, output, 36 "结果如下:", 37 JOptionPane.INFORMATION_MESSAGE ); 38 39 40 41 42 43 } 44 } 45
第三种:使用递归的方法用组合数递推公式计算
1 package practice3; 2 //使用递归的方法用组合数递推公式计算 3 //@吕鹏博 2016年10月15日21:04:57 4 import javax.swing.JOptionPane; 5 public class Yanghui3 { 6 7 public static void main(String[] args) { 8 String firstnumber=JOptionPane.showInputDialog( "请输入第一个数" ); 9 String secondnumber=JOptionPane.showInputDialog( "请输入第二个数" ); 10 int number1 = Integer.parseInt( firstnumber ); 11 int number2 = Integer.parseInt( secondnumber ); 12 int max; 13 int min; 14 if(number1>number2) 15 { 16 min=number2; 17 max=number1; 18 } 19 else 20 { 21 max=number2; 22 min=number1; 23 } 24 int get=crule(max,min); 25 String output="组合数C["+max+"]["+min+"]最终的结果为:"; 26 output+=get; 27 JOptionPane.showMessageDialog(null, output, 28 "结果如下:", 29 JOptionPane.INFORMATION_MESSAGE ); 30 31 } 32 public static int crule(int number1,int number2){ 33 if(number2==0||number2==number1) 34 { 35 return 1; 36 } 37 else 38 { 39 return crule(number1-1,number2-1)+crule(number1-1,number2); 40 } 41 } 42 43 }
第二题:递归编程解决汉诺塔问题。用Java实现
1 package practice3; 2 //汉诺塔问题的步骤 3 //@吕鹏博 2016年10月15日19:58:33 4 public class TowersOfHanoi { 5 // recursively move disks between towers 6 public static void solveTowers( int disks, int sourcePeg, 7 int destinationPeg, int tempPeg ) 8 { 9 10 if ( disks == 1 ) 11 { 12 System.out.printf( "\n%d --> %d", sourcePeg, destinationPeg ); 13 return; 14 } 15 16 17 solveTowers( disks - 1, sourcePeg, tempPeg, destinationPeg ); 18 19 // move last disk from sourcePeg to destinationPeg 20 System.out.printf( "\n%d --> %d", sourcePeg, destinationPeg ); 21 22 // move ( disks - 1 ) disks from tempPeg to destinationPeg 23 solveTowers( disks - 1, tempPeg, destinationPeg, sourcePeg ); 24 } // end method solveTowers 25 26 public static void main( String[] args ) 27 { 28 int startPeg = 1; // value 1 used to indicate startPeg in output 29 int endPeg = 3; // value 3 used to indicate endPeg in output 30 int tempPeg = 2; // value 2 used to indicate tempPeg in output 31 int totalDisks = 3; // number of disks 32 33 // initial nonrecursive call: move all disks. 34 solveTowers( totalDisks, startPeg, endPeg, tempPeg ); 35 } // end main 36 } // end class TowersOfHanoi
解题算法:
如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘子,就将B当作辅助柱。
如果盘数超过2个,将最后一个盘子遮起来,就很简单了,每次处理两个盘子,也就是:A->B、A ->C、B->C这三个步骤,而被遮住的部份,
其实就是进入程序的递回处理。(进入下一次递归之后,柱的相对位置就变了)
第三题:使用递归方式判断某个字串是否是回文( palindrome )
“回文”是指正着读、反着读都一样的句子。比如“我是谁是我”
使用递归算法检测回文的程序如下:
1 package practice3; 2 //使用递归方式判断某个字串是否是回文( palindrome ) 3 //@吕鹏博 2016年10月15日21:15:04 4 import javax.swing.JOptionPane; 5 public class Palindrome { 6 7 public static void main(String[] args){ 8 String test=JOptionPane.showInputDialog( "请输入需要判断的字符串:" ); 9 int i = 0; 10 int j = test.length() - 1; 11 String output1=" "; 12 if(isPalindrome(test, i, j)) 13 { 14 output1="是"; 15 } 16 else 17 { 18 output1="否"; 19 } 20 String output= test + " 是否是回文字符串? \n" +output1; 21 JOptionPane.showMessageDialog(null, output, 22 "结果如下:", 23 JOptionPane.INFORMATION_MESSAGE ); 24 25 } 26 //判断是否是回文字符串的方法: 27 public static boolean isPalindrome(String s,int i,int j){ 28 if(i > j) 29 throw new IllegalArgumentException(); 30 if(i == j) 31 return true; 32 else{ 33 return (s.charAt(i) == s.charAt(j)) && isPalindrome(s,i+1,j-1); 34 } 35 } 36 37 }
课上总结:
“递归”是“由后至前再回来”,要求第n项,先求第n-1项,……,倒推到前面的可计算出的某项,然后再返回。
递推”是“从前到后”,先求第1项,然后,在此基础上求第2项,第3项,直至第n项,通常可以直接使用循环语句实现。
每个递归函数的开头一定是判断递归结束条件是否满足的语句(一般是if语句);
函数体一定至少有一句是“自己调用自己”的。
每个递归函数一定有一个控制递归可以终结的变量(通常是作为函数的参数而存在)。每次自己调用自己时,此变量会变化(一般是变小),并传送给被调用的函数。
Java支持可变参数的方法
1 public static double max(double ... values) 2 { 3 double largest=Double.MIN_VALUE; 4 for (double v:values) 5 if(v>largest) 6 largest=v; 7 return largest; 8 } 9 10 11 System.out.println("Max:"+max(1,11,300,2,3));
生成随机数的方法:
关于程序在另一篇博文中写出。

浙公网安备 33010602011771号