public class Temp {
//递归求解组合数C(n,m),将组合结果放到allList中
private static void recurse(int k, int n, int m, List<List<Integer>> allList, List<Integer> nowList){
//k代表当前组合到了第几个数
List<Integer> newNowList = new ArrayList<>(nowList);
if(k == m){//递归出口,最后一位数仍然有n-m+1种情况,所以都列出
List<Integer> alPut = new ArrayList<>();
for(int c = 0; c < n - m + 1; c++){
newNowList = new ArrayList<>(nowList);
for(int i = nowList.size() > 0 ? nowList.get(nowList.size() - 1) + 1 : 0; i < n; i++){//取出上次排的最后一个元素,并加1为下一个元素
if(!newNowList.contains(i) && !alPut.contains(i)){
newNowList.add(i);
alPut.add(i);
allList.add(newNowList);
break;//插入了就跳出这个循环
}
}
}
return;
}
newNowList = new ArrayList<>(nowList);
//而且最大的一个数是n-m,因为是组合,所以上界停在这里(只针对第一种情况),所以要判断一下
int top = 0;
if(k == 1){
top = n - m + 1;
} else{
top = n;
}
//取出上次排的最后一个元素,并加1为下一个元素
for(int i = nowList.size() > 0 ? nowList.get(nowList.size() - 1) + 1 : k - 1; i < top; i++){//每次考虑n位数,由于这里是组合,所以就从k开始,前面的数已经放进去了,就不考虑了
newNowList = new ArrayList<>(nowList);
if(!newNowList.contains(i)){
newNowList.add(i);
recurse(k + 1, n, m, allList, newNowList);
}
}
}
public static void main(String[] args) {
List<List<Integer>> allList = new ArrayList<>();
List<Integer> nowList = new ArrayList<>();
recurse(1, 6, 3, allList, nowList);
System.out.println(allList.size());
for(int i = 0; i < allList.size(); i++){
nowList = allList.get(i);
System.out.println(nowList);
}
}
}
递归求解C(n,m)
最新推荐文章于 2023-02-16 21:54:34 发布