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


    (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 }

    【截图】

  • 相关阅读:
    Java的快速失败和安全失败
    Java RMI与RPC的区别
    Java动态代理之JDK实现和CGlib实现(简单易懂)
    JVM——字节码增强技术简介
    Linux内存分配机制之伙伴系统和SLAB
    操作系统动态内存管理——malloc和free的工作机制
    Java中的Map
    Java的PriorityQueue
    Java中的List
    Java中的Set
  • 原文地址:https://www.cnblogs.com/sdysyhj/p/7664859.html
Copyright © 2020-2023  润新知