排列的递归算法

从{1,2,3,...n}个数字中找到 0<m<=n 的排列

思路:假设 Pn={1,2,3,...n},  Lm=Pn-m(从Pn集合中去掉 m元素的集合),那么 

n个数中选取m个算法就是,先从 Pn集合中,随机选取一个,在从剩下的集合中选取 m-1个的排列,

那么p(n,m)表示:n个数中选取m个数

p(n,m) = Pn中选择1个,假设是k,连接上Lk 中排列 m-1的组合;

代码如下:

/**
 * Created by wuss on 2017/8/23.
 * 排列
 */
public class Permutation {

    /**
     * {1,2,3,...,n}
     * 思路:需要从n个数中全排列m个数 ,先从n个数中选取一个,在从n-1个中排列 m-1个,
     *
     *
     * @param hasChoseStr:已经选取好的排列
     * @param chArr:剩余的排列
     * @param len:还剩余选择 几个
   
     */
    private static void permutation(String hasChoseStr,char[] chArr,int len){
        if(len == 1){//从str中全排列1个
            for(int i=0;i<chArr.length;i++){
                System.out.println(hasChoseStr+chArr[i]);
            }
        }else {
            for(int j=0;j<chArr.length;j++){//从str中随机选取一个
                String ss = hasChoseStr+chArr[j];
                char[] newChar = new char[chArr.length-1];//从str中去掉选择的数。在选取 len-1个
                int n=0;
                for(int k=0;k<chArr.length;k++){
                    if(k!=j){
                        newChar[n++]=chArr[k];
                    }
                }
                permutation(ss,newChar,len-1);
            }
        }
    }

    public static void main(String[] args) {
        permutation("","abc".toCharArray(),3);
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值