使用计算机计算组合数,递归编程解决汉诺塔问题,使用递归方式判断某个字串是否是回文

(1)使用组合数公式利用n!来计算

【程序设计思想】

先将公式化简,上下同时约去(n-k)!

然后计算从(n-k+1)到n的乘积

再用这个乘积除以n!

【流程图】

【源代码】

 1 /**
 2  * 
 3  */
 4 package 课堂2;
 5 import java.math.BigInteger;
 6 import java.util.Scanner;
 7 /**
 8  * @author 信1605-3  20163471 吴鑫
 9  *
10  */
11 public class LotteryOdds
12 {
13 
14     /**
15      * @param args
16      */
17     public static void main(String[] args)
18     {
19         // TODO 自动生成的方法存根
20         Scanner in = new Scanner(System.in);
21         System.out.print("选择的元素个数:");
22         int k = in.nextInt();
23         System.out.print("元素的总个数:");
24         int n = in.nextInt();
25         BigInteger bigInteger = BigInteger.valueOf(1l);
26         for (int i = n; i >= n - k + 1; i--)
27         bigInteger = bigInteger.multiply(BigInteger.valueOf(i));////计算(n-k+1)到n的乘积
28         for (int i = 1; i <= k; i++)
29         bigInteger = bigInteger.divide(BigInteger.valueOf(i));
30         System.out.println("组合数为" + bigInteger.toString());
31     }
32 
33 }

【截图】

(2)使用递推的方法用杨辉三角计算

【程序设计思想】

输入n和k的值,创建一个二维数组

通过循环,在第一个循环里,定义i=1,在循环里嵌套循环

定义当j=0时,先判断j是否等于0或者i是否等于j

若成立则输出arr[i-1][j]=1

否则第i-1行j列的数等于第i-2行j列的数与第i-2行j-1列的数之和

最后输出结果。

【流程图】

【源代码】

 1 package 课堂2;
 2 
 3 import java.util.Scanner;
 4 
 5 /**
 6  * @author 信1605-3  20163471 吴鑫
 7  *
 8  */
 9 
10 public class LotteryOdds02
11 {
12 
13     public static void main(String[] args)
14     {
15         // TODO 自动生成的方法存根
16         int n, k;// 组合数公式中的n k
17         Scanner input = new Scanner(System.in);
18         System.out.print("选择的元素个数:");
19         k = input.nextInt();
20         System.out.print("元素的总个数:");
21         n = input.nextInt();
22         int[][] f = new int[27][27];// 构建杨辉三角
23         f[0][0] = 1;
24         for (int i = 1; i <= 24; i++) {
25             for (int j = 1; j <= i + 1; j++) {
26                 f[i][j] = f[i - 1][j - 1] + f[i - 1][j];
27             }
28         }
29         System.out.println("使用递推的方法用杨辉三角形计算结果为   " + f[n + 1][k + 1]);// 输出结果
30     }
31 }

【截图】

(3)利用递归的方法用组合数递推公式计算

 【程序设计思想】

类似于杨辉三角的思想

构造一个递归函数用来递归组合数,需要有两个参数。

输入n和k

在输出结果中调用递归函数

递归函数中,首先进行数字的判断,考虑特殊情况,

当k=0或n=1或k=n时,输出都为1;

当不是上述情况时,递归计算组合数。

 【流程图】

【源代码】

 1 /**
 2  * 
 3  */
 4 package 课堂2;
 5 
 6 import java.util.Scanner;
 7 
 8 /**
 9  * @author 信1605-3  20163471 吴鑫
10  *
11  */
12 public class Lotteryodds03 {
13 
14     /**
15      * @param args
16      */
17     public static void main(String[] args) {
18         // TODO 自动生成的方法存根
19         int n, k;// 组合数公式中的n k
20         Scanner input = new Scanner(System.in);
21         System.out.print("选择的元素个数:");
22         k = input.nextInt();
23         System.out.print("元素的总个数:");
24         n = input.nextInt();
25         System.out.println("使用递归的方法用组合数递推公式计算结果为
"+    recursion(n,k));
26     }
27     static int recursion(int a,int b)
28     {
29         if(b==0)
30             return 1;
31         else 
32         {
33             if(a==1)
34                 return 1;
35             else 
36             {
37                 if(a==b)
38                     return 1;
39                 else
40                     return (recursion(a-1,b-1)+recursion(a-1,b));
41             }
42         }
43     }
44 }

【截图】

 

 【程序设计思想】

 问题可以分为两个操作:一是将n-1个盘从一个座移到另一个座上,这是一个递归的过程,二是将一个盘子从一个座上移到另一个座上。

【流程图】

【源代码】

 1 /**
 2  * 
 3  */
 4 package 课堂2;
 5 
 6 import java.util.Scanner;
 7 
 8 /**
 9  * @author 信1605-3 20163471 吴鑫
10  *
11  */
12 public class Hanota {
13 
14     /**
15      * @param args
16      */
17     public static void main(String[] args) {
18         // TODO 自动生成的方法存根
19         int m;
20         System.out.println("请输入要移动的数量:");
21         Scanner input=new Scanner(System.in);
22         m=input.nextInt();
23         System.out.println("移动如下:");
24         hanoi(m,'A','B','C');
25     }
26     static void hanoi (int n,char one,char two,char three)
27     {
28         if(n==1)  move(one,three);
29         else
30         {
31             hanoi(n-1,one,three,two);
32             move(one,three);
33             hanoi(n-1,two,one,three);
34         }
35     }
36     static void move(char x,char y)
37     {
38         System.out.println(x+"-->"+y);
39     }
40 }

【截图】

 

【程序设计思想】

判读是否回文就是依次判断字符串首尾字符是否一样的过程

声明两个指针i,j,从头开始依次比较首尾字母是否一致

若一致,则是回文,否则不是

【流程图】

【源代码】

 1 /**
 2  * 
 3  */
 4 package 课堂2;
 5 import java.util.Scanner;
 6 /**
 7  * @author 信1605-3  20163471 吴鑫
 8  *
 9  */
10 public class Palindrome
11 {
12     /**
13      * @param args
14      */
15     public static void main(String[] args)
16     {
17         // TODO 自动生成的方法存根
18         Scanner input=new Scanner(System.in);
19         String s=input.next();//输入字符串
20         int i,j;
21         i=0;//第一个字符
22         j=s.length()-1;//最后一个字符
23         System.out.println(HuiWen(s,i,j));
24     }
25     public static boolean HuiWen(String s,int i,int j)//判断字符串是否回文
26     {
27         if(i==j)
28         {
29             return true;
30         }
31         else if((i-1)==j)
32         {
33             return true;
34         }
35         return (s.charAt(i)==s.charAt(j))&&HuiWen(s,i+1,j-1);
36     }
37 }

【截图】

原文地址:https://www.cnblogs.com/sdysyhj/p/7664859.html