递归求解排列组合A(n,3)

这里是求解A(n, 3),在代码里面可以修改递归出口的条件if(k == 2),把2改成别的数来解决,当k=n时,就是全排列了:

public class Test {
	//递归求出排列组合A(n, 3)
	private void recurse(int k, ArrayList<Integer> mp, 
			ArrayList<ArrayList<Integer>> allList, ArrayList<Integer> list, HashSet<Integer> already){		
		for(int i = 0; i < mp.size(); i++){
			ArrayList<Integer> nowList = new ArrayList<>(list);
			HashSet<Integer> nowAready = new HashSet<>(already);
			
			if(already.contains(mp.get(i))){//去除前面重复的排过的数
				continue;
			}			
			if(k == 2){//递归出口,单独把后面的加完,否则会漏解
				for(int m = 0; m < mp.size(); m++){
					if(already.contains(mp.get(m))){
						continue;
					}
					nowList = new ArrayList<>(list);
					nowList.add(mp.get(m));					
					//System.out.println("k: " + k + "   nowlist.size: " + nowList.size());					
					allList.add(nowList);
				}								
				return;
			}
			else{
				nowList.add(mp.get(i));
				nowAready.add(mp.get(i));				
				//System.out.println("k: " + k + "   nowlist.size: " + nowList.size());				
				recurse(k + 1, mp, allList, nowList, nowAready);
			}
		}
	}
	
	public static void main(String[] args){
		ArrayList<Integer> now = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
		ArrayList<Integer> list = new ArrayList<>();
		HashSet<Integer> already = new HashSet<>();
		ArrayList<ArrayList<Integer>> allList = new ArrayList<>();
		Test test = new Test();
		test.recurse(0, now, allList, list, already);
		
		System.out.println("所有的排列数:" + allList.size());
		
		for(int i = 0; i < allList.size(); i++){
			list = allList.get(i);
			for(int k = 0; k < list.size(); k++){
				System.out.print(list.get(k) + " ");
			}
			System.out.println();
		}
	}
}

运行结果:

所有的排列数:60
1 2 3 
1 2 4 
1 2 5 
1 3 2 
1 3 4 
1 3 5 
1 4 2 
1 4 3 
1 4 5 
1 5 2 
1 5 3 
1 5 4 
2 1 3 
2 1 4 
2 1 5 
2 3 1 
2 3 4 
2 3 5 
2 4 1 
2 4 3 
2 4 5 
2 5 1 
2 5 3 
2 5 4 
3 1 2 
3 1 4 
3 1 5 
3 2 1 
3 2 4 
3 2 5 
3 4 1 
3 4 2 
3 4 5 
3 5 1 
3 5 2 
3 5 4 
4 1 2 
4 1 3 
4 1 5 
4 2 1 
4 2 3 
4 2 5 
4 3 1 
4 3 2 
4 3 5 
4 5 1 
4 5 2 
4 5 3 
5 1 2 
5 1 3 
5 1 4 
5 2 1 
5 2 3 
5 2 4 
5 3 1 
5 3 2 
5 3 4 
5 4 1 
5 4 2 
5 4 3 




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
递归排列组合中的应用非常广泛,可以用于求解排列、组合、子集等问题。 首先,我们来了解一下排列和组合的概念: 排列:从n个不同元素中取出m个元素进行排列,其排列数为n!/(n-m)!,其中“!”表示阶乘。 组合:从n个不同元素中取出m个元素进行组合,其组合数为n!/[(n-m)!m!]。 现在,我们使用递归算法来解决排列和组合问题。具体实现如下: 1. 排列问题 对于排列问题,我们可以使用递归算法,从n个元素中选择一个元素作为第一个位置,然后在剩下的n-1个元素中选择一个元素作为第二个位置,依此类推,直到选择了m个元素为止,最后输出一个排列方案。 代码实现如下: ```python def permutation(n, m, res, tmp): if len(tmp) == m: res.append(tmp[:]) return for i in range(1, n+1): if i not in tmp: tmp.append(i) permutation(n, m, res, tmp) tmp.pop() ``` 2. 组合问题 对于组合问题,我们可以使用递归算法,从n个元素中选择一个元素作为第一个位置,然后在剩下的n-1个元素中选择一个元素作为第二个位置,依此类推,直到选择了m个元素为止,最后输出一个组合方案。 代码实现如下: ```python def combination(n, m, res, tmp, start): if len(tmp) == m: res.append(tmp[:]) return for i in range(start, n+1): tmp.append(i) combination(n, m, res, tmp, i+1) tmp.pop() ``` 以上就是递归排列组合中的应用的简单介绍和代码实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值