经典的递归问题(全排列、从n个球中取出m个球、最大公共子序列 )

一、在n个球中,任意取出m个球(不放回),有多少种不同的方法
运行截图:
这里写图片描述

代码如下:

package sf_1;
public class Main {
    public static int f(int n,int m){
        /*
         * a b c      ......ab  ac  bc
         * 内部含有一个幸运球
         * 
         * f(n-1,m-1)-->  幸运球一定取-->娶了这个幸运球 ,则从n-1个球中再取m-1个球。
         * f(n-1,m)  -->  幸运球一定不取-->未取这个幸运球,则从n个球中取m个球。
         */
        if(n<m)//从2个球中取出3个球
            return 0;
        if(n==m)//从2个球中取出2个球
            return 1;
        if(m==0)//从5个球中取出0个球
            return 1;
        return f(n-1,m-1)+f(n-1,m);
    }

    //在n个球中,任意取出m个球(不放回),有多少种不同的方法
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int k=f(10,3);
        System.out.print(k);
    }
}

二、求 n个元素的全排列

package sf_2;
public class Main {
    /*
     * n个元素的全排列
     * abc acb bac bca cab cba
     * k表示当前的交换位置,与其后元素交换
     */
    public static void f(char[] data,int k){
        //0:与后面的所有元素交换
        //1:与后面的所有元素交换
        if(k==data.length){
            for(int i=0;i<data.length;i++)
                System.out.print(data[i]+"");
            System.out.println();
        }
        //试探和回溯在解决递归问题时很重要。
        for(int i=k;i<data.length;i++){
            {
                char t=data[k];
                data[k]=data[i];
                data[i]=t;
            }//试探
            f(data,k+1);
            {
                char t=data[k];
                data[k]=data[i];
                data[i]=t;
            }//回溯   
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        char[] data="ABC".toCh`
rArray();
        f(data,0);
    }
}

三、求两个串的最大公共子序列的长度

package sf_3;

public class Main {

    /**
     * 求两个串的最大公共子序列的长度
     * abcdef  的子序列:abc abd abe
     * 
     * 算法、可解、优化(将原来问题的规模变小)
     */
    public static int f(String s1,String s2){
        //当其中任何一个串为空时,则两个串的最大公共子序列的长度为0
        if(s1.length()==0||s2.length()==0)
            return 0;
        //当首字母相等的时候,只需要对于剩下的串求其最长公共子序列后 再加1.
        if(s1.charAt(0)==s2.charAt(0))  
            return f(s1.substring(1),s2.substring(1))+1;
        else
        //当首字母不相等的时候,作如下处理:
            /*
             * f(s1.substring(1),s2)
             * f(s1,s2.substring(1))
             */
            return Math.max(f(s1.substring(1),s2),f(s1,s2.substring(1)));
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int k=f("abc","xbacd");
        System.out.print(k);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值