Java实现排列A(m,n)

来源:互联网 发布:双色球数据分据库 编辑:程序博客网 时间:2024/06/05 23:07

遇到一个算法题目,是求在n个数字中取m个数字(有序),有多少种可能。我一看,这么简单,就是A(n,m)呀。但是自己动手写代码的时候却发现好难实现,这就是所谓眼高手低吧,网上查了一下,把自己的理解记下来吧,方便以后回顾:

package sky_100;import java.util.Arrays;import java.util.LinkedList;import java.util.List;public class Permutations {    static int sum = 0;    public static void main(String[] args) {        Permutations per = new Permutations();        String[] str = {"1","2","3","4"};        int total = 2;        List<String> list = Arrays.asList(str);        per.recursive("", total, list);        System.out.println("总数为:"+sum);    }    /**     *      * @param prefix 拼接结果前缀      * @param total 需要从N个数中取total个数     * @param list  含有N个数的集合     */    public void recursive(String prefix,int total, List<String> list) {        //总的要循环多少次        for(int i=0;i<list.size();i++){            LinkedList<String> tempList = new LinkedList<String>(list);//复制一份list,不能对原list进行操作            String remove = tempList.remove(i);//从集合中移出某个元素,防止出现重复数字            String s = prefix+remove;//拼接结果            if(total == 1){//当从N个数中取1个数时                System.out.println(s);//直接输出结果                sum++;            }else{                int temp = total-1;//每到这里就得减一层                recursive(s, temp, tempList);//这里所传的值都是新值            }        }    }    /**     * 理解递归:以total为2,str={"1","2","3","4"}为例,     * 第一次递归有一个for循环,然后这个for循环又套一层for循环     * for(i=0;i<4;i++){     *      //因为集合中被移除一个数     *      for(i=0;i<3;i++){     *          ...     *      }     * }     */}
原创粉丝点击