qq_36144908 2016-09-17 08:28 采纳率: 0%
浏览 3872

java中的递归求几个数字的排列组合

public class Test5 {
public static void main(String[] args) {

     List<Integer> s=new ArrayList<Integer>();  
     List<Integer> rs=new ArrayList<Integer>();  
     for(int i=1;i<=4;i++)  
         s.add(i);  
     pl(s,rs);  

}

public static void pl(List s,List rs){

   if(s.size()==1)  
   {  

       rs.add(s.get(0));  
       System.out.println(rs.toString());  
       rs.remove(rs.size()-1);  

   }else{  

       for(int i=0;i<s.size();i++){  

           rs.add(s.get(i));   
           List<Integer> tmp=new ArrayList<Integer>();  
           for(Integer a:s)  
              tmp.add(a);  
           tmp.remove(i);  
          pl(tmp,rs);  
          rs.remove(rs.size()-1);      

       }  
   }                     

}

}

 求大神问一下这段递归是什么意思?,新人表示看不懂
  • 写回答

2条回答 默认 最新

  • ZhihengTao 2016-09-17 11:36
    关注

    深度优先遍历思想:
    for(int ...)
    每次从当前剩下的可选数字中选出一个

    for(Integer ...)
    tmp.add()
    tmp.remove
    用于挑选出剩下的还未被挑选的数字
    pl(tmp, rs)
    递归选择下一个数字
    rs.remove(rs.size()-1)
    rs添加s.get(i)的情况结束,移除最后选择的数字,以运行循环选择另一个不同的数字

    说实话这递归写的不怎么样啊,开销很大,逻辑不够清晰。
    我写的一个递归解法如下:

    public class Sort
    {
    public static void main(String[] args)
    {
    int size = 4;
    int[] result = new int[size];
    int[] status = new int[size];
    for(int i = 0; i < size; i++)
    {
    result[i] = 0;
    status[i] = 0;
    }
    int expect = 1;
    for(int i = 2; i <= size; i++)
    {
    expect *= i;
    }
    System.out.println("Expect total = "+expect);
    int total = sort(result, status, 0);
    System.out.println("Real total="+total);
    }

    /**
    * find an available element in status array to fill result[index].
    * If index == status.length, result array has been completely filled.So, just print it.
    * status[i]=0 means that i is available, status[i]=1 means that i has been used.
    */
    public static int sort(int[] result, int[] status, int index)
    {
        int total = 0;
        int len = status.length;
        //result has been completely filled, print the array
        if(index >= len)
        {
            for(int i = 0; i < len; i++)
                System.out.print(result[i]+" ");
            System.out.println();
            return 1;
        }
        //find an avaliable element
        for(int i = 0; i < len; i++)
        {
            //select an available element
            if(status[i] != 1)
            {
                result[index] = i;
                status[i] = 1;
                //select the next element whose index is (index+1)
                total += sort(result, status, index+1);
                //finish selected the element whose index is (index+!), release i
                status[i] = 0;
            }
        }
        return total;
    }
    

    }

    评论

报告相同问题?

悬赏问题

  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问