第三讲课后题

 第一题:利用杨辉三角形原理来计算组合数
       共有三种方法:

      第一种:运用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 }
运用n的阶乘计算组合数

      第二种:使用递推的方法用杨辉三角形计算

 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));
可变参数


生成随机数的方法:

关于程序在另一篇博文中写出。

 







 

posted @ 2016-10-15 21:44  L.P.B_Blizzard  阅读(218)  评论(0)    收藏  举报