//目的: 输出 从N个元素里挑出K个组合数
// 例如 ABC中取2个有 AB BC  AC  static void combinations2(String[] arr, int len, int startPosition, String[] result)
    {
              //  String[] arr = {"A","B","C","D","E","F"};
              //combinations2(arr         ,       3,       0          ,   new String[3]);
        if (len == 0)
        {
            System.out.println(Arrays.toString(result));
            return;
        }
        for (int i = startPosition; i <= arr.length-len; i++)
        {
            result[result.length - len] = arr[i];
            combinations2(arr, len-1, i+1, result);
        }
    }

解决方案 »

  1.   

    往result里写数据时候用到了递归,以 ABC中取2个为例,有这样的规律:result[0]取A的话,result[1]的取值就是从BC中取1个。可以看到递归外层还有一个循环,循环的目的就是限制第一个值,这样后面的值就可以递归了。不是高人,说的也太不清楚,凑合看吧
      

  2.   

    以此为例:String[] arr = {"A","B","C","D","E","F"};
    combinations2(arr,3,1,new String[3]);
    结果:[B, C, D]
    [B, C, E]
    [B, C, F]
    [B, D, E]
    [B, D, F]
    [B, E, F]
    [C, D, E]
    [C, D, F]
    [C, E, F]
    [D, E, F]
    第一次循环是先在result添加B,然后第二次循环添加C,第三次循环添加E,这样就变成[B,C,E],
    此时len循环三次就变成0了,所以执行
    if (len == 0)
            {
                System.out.println(Arrays.toString(result));
                return;
            }
    就是打印一个[B,C,E]的循环。其它的也是一样
      

  3.   

    断点跟进一下吧,看懂了说不明白。这个想法很厉害,大致意思就像进位一样,AB[C,D,E,F]取完后B进一位,直到进位结束。开阔眼界了,感谢!