日期:2014-05-20  浏览次数:20768 次

把一个数组里面的组合全部列出来,看不很懂
Java code
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 哪位前辈解释一下呢

------解决方案--------------------
循环里加一句:
Java code

System.out.println("now candidate is: "+candidate);

------解决方案--------------------
这个靠debug还是比较难理解的,我觉得一层一层的好理解
比如第一次进入listAll:
for循环依次取出4个字符
1 [2,3,4]
2 [1,3,4]
3 [1,2,4]
4 [1,2,3]
然后再分别根据这四个情况,进一步从candidate里面用for循环取。
------解决方案--------------------
算法其实就是现在有几个数,就先分成几组,例如[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开头的都是同理了。
------解决方案--------------------
光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++继续递归下去。。。