2015-11-26 53 views
1

我试图实现这样的事情。动态嵌套for循环使用递归(所有排列)

我有一堆列表。

每个列表都有一定的数字。

我想找到A,B,C列表 这是所有排列:

1,4,6  
1,4,7  
1,4,8  
1,5,6  
1,5,7  
1,5,8  
2,4,6 
and so on... 

我可以使用循环已经这样做了,但列出的数量不是一成不变的。

所以我尝试使用递归。

这里是我的尝试: 呼叫:

nested(number_of_lists,0, array list of array, current_permutation); 

而且功能:

static void nested(int depth, int index, ArrayList< ArrayList<Integer> > list, ArrayList<Integer> curr) 
{ 

    if(depth==0) 
    { 


     ArrayList <Integer> x = new ArrayList<>(); 
     int i; 
     for(i=0;i<curr.size();i++) 
     { 
      System.out.println(curr.get(i)); 

      x.add(curr.get(i)); 
     } 
     global.add(x); 

     curr.remove(curr.size()-1); 

    } 
    else 
    { 

     for(int i=0;i<list.get(index).size();i++) 
     { 

      curr.add(list.get(index).get(i)); 

      nested(depth-1, index+1, list, curr); 

      if(curr.size()==list.get(index).size()) 
      { 
       curr.remove(curr.size()-1); 
      } 

      if(index==0 &&(curr.size()-1) == i) 
       curr = new ArrayList<>(); 


     } 
    } 

} 

全球是存储了所有排列数组列表的新数组列表。

但是,两个置换与A之后,我得到错误的答案

1 4 6 
1 4 7 
1 4 8 
1 5 6 
1 5 7 
1 5 8 
2 4 6 
2 4 7 
2 4 8 
2 5 6 
2 5 7 
2 5 8 
2 3 4 6 
2 3 7 
2 3 8 
2 5 6 
2 5 7 

等..

哪里代码做错了。 我的前两个A有两个元素的排列非常好。 对不起,这么长的解释。 一些帮助,将不胜感激。

回答

1

你似乎使这比实际情况更复杂。我已经设法通过评论你的一些线条来纠正这一点。

static void nested(int depth, int index, ArrayList< ArrayList<Integer> > list, ArrayList<Integer> curr) 
{ 

    if(depth==0) 
    { 


     ArrayList <Integer> x = new ArrayList<>(); 
     int i; 
     for(i=0;i<curr.size();i++) 
     { 
      System.out.println(curr.get(i)); 

      x.add(curr.get(i)); 
     } 
     global.add(x); 

     //curr.remove(curr.size()-1); 

    } 
    else 
    { 

     for(int i=0;i<list.get(index).size();i++) 
     { 

      curr.add(list.get(index).get(i)); 

      nested(depth-1, index+1, list, curr); 

      //if (curr.size()==list.get(index).size()) 
      //{ 
       curr.remove(curr.size()-1); 
      //} 

      //if(index==0 &&(curr.size()-1) == i) 
      // curr = new ArrayList<>(); 


     } 
    } 

} 
+0

非常感谢。任何其他方式做或是这是最好的方法? –

+1

您可以进行一些改进。例如,你不需要'index'和'depth',因为它们总是加到'list.size()'。另外,涉及'x'的整个部分可以用'global.add(new ArrayList <>(curr));'替换。最后,尽量避免全局变量。相反,只需在该方法中添加'global'作为参数即可。 –