组合数,汉诺塔,回文

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

  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,结果:

        

原文地址:https://www.cnblogs.com/zhaochenguang/p/7665666.html