排列组合的递归

令E={e1,e2,…,en}表示n个元素的集合,;Ei为E中移去元素ei后的集合,perm(X)表示集合X中元素的排列方式。Ei*perm(X)表示在集合X的每个排列方式的前面都加上ei后所得的排列方式。

则集合E的排列组合等于:

n= 1;perm(E) = {e1};

n> 1;perm(E) = e1*perm(E1)+e2*perm(E2)+……+en*perm(En);

#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>
using namespace std;

/*	求n个元素的排列组合
*	n = 1;perm(E) = {e1};
*	n > 1;perm(E) = e1*perm(E1)+e2*perm(E2)+……+en*perm(En);
*/
void fun(vector<int> & vec,vector<int>::iterator iter)
{
	if(iter+1 == vec.end())
	{
		copy(vec.begin(),vec.end(),ostream_iterator<int>(cout," "));
		cout<<endl;
		return;
	}
	for (vector<int>::iterator it = iter; it< vec.end(); it++)
	{
		swap_ranges(it,it+1,iter);
		fun(vec,iter+1);
		swap_ranges(it,it+1,iter);
	}
}

int main()
{
	vector<int> vec;
	copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(vec));
	fun(vec,vec.begin());
}

/*
	输入和运算结果:
	1 2 3 4^Z
	1 2 3 4
	1 2 4 3
	1 3 2 4
	1 3 4 2
	1 4 3 2
	1 4 2 3
	2 1 3 4
	2 1 4 3
	2 3 1 4
	2 3 4 1
	2 4 3 1
	2 4 1 3
	3 2 1 4
	3 2 4 1
	3 1 2 4
	3 1 4 2
	3 4 1 2
	3 4 2 1
	4 2 3 1
	4 2 1 3
	4 3 2 1
	4 3 1 2
	4 1 3 2
	4 1 2 3
	请按任意键继续. . .
*/

排列组合的递归,布布扣,bubuko.com

时间: 2024-10-26 10:03:12

排列组合的递归的相关文章

用递归写排列组合问题

最近递归弄的人头疼,但是这两天看过来也稍微总结了一些不能称得上是技巧的技巧吧 问题如下,将1,2,3,4这四个数字排列组合的输出来,看网上有个很二的方法吧,就是将10000以内的数全部输出再筛选,对此有点无语,但是程序倒是挺好编的,嘿嘿 回归到正题中,用递归的思想解决 (1)采用旋转数字的方法,当步长为1时,1234还是1234,步长为2的时候,1234可以变为1243.1324...,步长为3 的时候,1234可以变为1423,诸如此类,最重要的能体现递归的就是将每次递归一次的数字还可以接着旋

排列组合问题(递归实现)

在做递归问题时,要保证对递归跳跃的信任,继而对相应的问题寻找其递归实现 (1)组合:先从原始数组中选择一个,再从剩下的集合中选择m-1个:而后,再从剩下的集合中挑选m个元素. /*组合代码(eg:5选2)*/ int a[5]={1,2,3,4,5};//原始数组 int b[2];//挑选的结果 const int need=2;//需要选择的个数 void combine(int start,int end,int x) { if(x==need) { //(1)打印组合的内容 /* for

递归求解几类排列组合问题(一、类循环组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. 一.类循环组合排列 Sample Input : 4 2 Sample Output 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 10

递归求解几类排列组合问题(二、全组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 3 1 2 3 Sample Output 123 132 213 231 312 321 #include<stdio.h> #include<strin

递归求解几类排列组合问题(三、非重复组合排列)

三.非重复组合排列(含重复数字时,生成不重复组合排列) 对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 4 1 2 2 3 Sample Output 1223 1232 1322 2123 2132 2213

递归求解几类排列组合问题(四、普通选择性组合排列)

四.普通选择性组合排列 对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 5 3 1 2 3 4 5 Sample Output 123 124 125 134 135 145 234 235 245 345 #i

JavaScript 递归法排列组合二维数组2

<html> <head> <title>二维数组排列组合</title> </head> <body> <div id="showDiv"></div> </body> <script type="text/javascript"> var arrays = [ [ '1-1-雨尘', '1-2-芸芸', '1-3-简一', '1-4-乐乐' ]

JavaScript 递归法排列组合二维数组

<html> <head> <title>二维数组排列组合</title> </head> <body> <div id="showDiv"></div> </body> <script type="text/javascript"> var arrays = [ [ '1-1-雨尘', '1-2-芸芸', '1-3-简一', '1-4-乐乐' ]

9.9递归和动态规划(五)——确定某字符串的所有排列组合

/** * 功能:确定某字符串的所有排列组合. */ 注意:不考虑重复字符.若考虑重复字符,只需在加入permulations时去掉重复的字符串即可. /** * 思路:元素由少到多,将新的元素塞进所有字符串中间的任意可能位置. * @param str * @return */ public static ArrayList<String> getPerms(String str){ if(str==null) return null; ArrayList<String> per