package me.luger.base;import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;public class Test1 {
public static void main(String[] args)  {
String[] array = new String[]{"1","2","3","4"};
listAll(Arrays.asList(array), "");
}
public static void listAll(List candidate, String prefix) {
//if(candidate.isEmpty()){
System.out.println(prefix);
//}
for(int i=0;i<candidate.size();i++) {
List tmp = new LinkedList(candidate);
listAll(tmp, prefix + tmp.remove(i));//函数中的参数从右边开始解析
}
}
}不知道为什么这么用递归,而且递归不好用bebug 哪位前辈解释一下呢

解决方案 »

  1.   

    循环里加一句:System.out.println("now candidate is: "+candidate);
    就好理解点了.
    结果靠prefix输出的。
      

  2.   

    这个靠debug还是比较难理解的,我觉得一层一层的好理解
    比如第一次进入listAll:
    for循环依次取出4个字符
    1 [2,3,4]
    2 [1,3,4]
    3 [1,2,4]
    4 [1,2,3]
    然后再分别根据这四个情况,进一步从candidate里面用for循环取。
      

  3.   

    算法其实就是现在有几个数,就先分成几组,例如[1,2,3,4]那么递归第一层就是1-[2,3,4],2-[1,3,4],3-[1,2,4],4-[1,2,3]。然后把list传入继续递归以1-[2,3,4]为例:又分为2-[3,4], 3-[2,4], 4-[2,3]并且吧这些与第一层的1拼接成为2-[3,4], 13-[2,4], 14-[2,3],然后list继续递归下去,这样就把1开头的组合都排列完了。2,3,4开头的都是同理了。
      

  4.   

    光debug是很难理解的以下是我的理解。
    主要看candidate里的值的变化。1,candidate=1 2 3 4 输出 空
    2,candidate=2 3 4 输出 1
    3,candidate=3 4 输出 12
    4,candidate=4 输出 123
    5,candidate= 输出 1234循环完了,回到第3步(因为4,5的size<=1),i=1继续循环
    candidate=3 输出 124
    candidate= 输出 1243第3步(i=0,i=1)也循环完了,回到第2步,i=1继续循环
    6,candidate=2 4 输出 13
    candidate=4 输出 132
    candidate= 输出 1324第6步继续循环,i=1
    candidate=2 输出 134
    candidate= 输出 1342继续循环第2步,i=2
    7,candidate=2 3 输出 14
    candidate=3 输出 142
    candidate= 输出 1423循环第7步,i=1
    candidate=2 输出 143
    candidate= 输出 1432至此,第二步全部循环完毕(i=0,i=1,i=2),也就是1开头的全部完毕,
    接着循环第一步(i=1)candidate=1 3 4 输出 2
    。下同总之当递归到candidate.size<=1时,就向上一层i++继续递归下去