• 组合数,汉诺塔,回文


    一、使用计算机计算组合数

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

        a,思想:利用n!计算 先算n!,k!,(n-k)!   

        b,程序流程图:

                      

        c,源代码:

              

    import java.math.BigInteger;
    import java.util.Scanner;
    
    
    public class zuhe {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            Scanner scanner=new Scanner(System.in);
            System.out.print("请输入n:");
            int num1=scanner.nextInt();
            System.out.print("请输入k:");
            int num2=scanner.nextInt();
            BigInteger C,n,k,nk;
            n=calculate(num1);
            k=calculate(num2);
            nk=calculate(num1-num2);
            C=n.divide(k.multiply(nk));
            System.out.println("Cn^k="+C);
            
        }
        
    
        public static BigInteger calculate(int n) {
            if(n==1 || n==0){
                return BigInteger.valueOf(1);
            }
            return BigInteger.valueOf(n).multiply(calculate((n-1)));
        }
    }

        d,结果:

                

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

        a,思想:利用杨辉三角,找到对应位置,即结果。

        b,流程图:

              

        c,源代码:

    import java.util.Scanner;
    
    public class yang {
    
        public static void main(String[] args) {
            System.out.print("请输入n:");
            Scanner scanner=new Scanner(System.in);
            int n=scanner.nextInt();
            System.out.print("请输入k:");
            int k=scanner.nextInt();
            int num[][]=new int[n+1][n+1];
            System.out.print("Cn^k="+jisuan(n,k, num));
    
        }
    
        private static int jisuan(int n, int k,int num[][]) {
            int i,j;
            for(i=0;i<=n;i++){
                num[i][i]=1;
                num[i][0]=1;
            }
            for(i=2;i<=n;i++){
                for(j=1;j<i;j++){
                    num[i][j]=num[i-1][j-1]+num[i-1][j];
                }
            }
            return num[n][k];
            
        }
    }

        d,结果:

            

      

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

        a,思想:通过组合数数据规律,利用递归解决。

        b,流程图:

              

        c,源代码:

    import java.util.Scanner;
    
    public class zuhe {
    
        public static void main(String[] args) {
            
            System.out.print("请输入n:");
            
            Scanner input = new Scanner(System.in);
              
            int n = input.nextInt();
            
            System.out.print("请输入k:");
            
            int k = input.nextInt();
            
            System.out.print("Cn^k= "+jisuan(n,k));
            
        }
    
        public static long jisuan(int m,int n)
        
        {
            
            if(m == n || n == 0)
                
                return 1;
            else{
                return jisuan(m - 1,n - 1)+jisuan(m - 1,n);
            }
        }
    
    }

        d,结果:

            

    二、递归编程解决汉诺塔问题

      a,思想:(1)n-1  A-->B

          (2)n     A-->C

             (3)n-1  B-->C    (1)(3)通过递归循环实现

      b,流程图:

          

      c,源代码:

            

    import java.util.Scanner;
    
    public class ta {
    
        public static void main(String[] args) {
            
            System.out.print("请输入盘子的个数:");
            
            Scanner input = new Scanner(System.in);
            
            int pan = input.nextInt();
            
            System.out.println("挪动这"+pan+"盘子的步骤为:");
            
            hanoi(pan, 'A', 'B', 'C');
            
        }
    
        public static void hanoi(int n,char a,char b,char c) 
        
        {
            
            if(n == 1)
                
            {
                
                move(a,c);
                
            }
            
            else
                
            {
                
                hanoi(n-1,a,c,b);
                
                move(a,c);
                
                hanoi(n-1,b,a,c);
                
            }
            
        }
    
        public static void move(char a, char c)
        
        {
            
            System.out.println(a+"-->"+c);
            
        }
    
    }

      d,结果

            

    三、使用递归方式判断某个字串是否是回文

      a,思想:判断头尾字符是否相等,利用递归一次向中间推进。

      b,流程图:

                  

      c,源代码:

    import java.util.Scanner;
    
    public class huiwen {
        
        public static void main(String[] args) {
            
            System.out.print("请输入要判断的字符串:");
            
            Scanner input = new Scanner(System.in);
            
            String in = input.next();
            
            int pre = 0,end = in.length() - 1;
            
            if(panduan(in,pre,end))
                
                System.out.println(in+"是回文字符串!");
            
            else
                
                System.out.println(in+"不是回文字符串!");
    
        }
    
        public static boolean panduan(String in,int pre, int end)
        {
            
            if(pre >= end)
                
                return true;
            
            else
                
            {
                
                if(in.charAt(pre) == in.charAt(end))
                    
                    return panduan(in,pre+1,end-1);
                
                else
                    
                    return false;
                
            }
            
        }
    
    }

      d,结果:

            

  • 相关阅读:
    关于虚析构函数的作用和使用
    CXF实战之拦截器Interceptor(四)
    基于AngularJS的个推前端云组件探秘
    《python源代码剖析》笔记 python中的List对象
    STL 笔记(四) 迭代器 iterator
    <html>
    Android蓝牙BLE低功耗相关简单总结
    错误: -source 1.6 中不支持 diamond 运算符
    IDEA将指定package(指定文件)打成jar包
    清理收藏夹中的json
  • 原文地址:https://www.cnblogs.com/zhaochenguang/p/7665666.html
Copyright © 2020-2023  润新知