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

  在做递归问题时,要保证对递归跳跃的信任,继而对相应的问题寻找其递归实现

(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(int i=0;i<need;i++)
{
cout<<b[i]<<" ";
}
cout<<endl;
*/
//(2)对每一种组合进行排列
permute(b,0,2);//见下
return;
}
if((end-start)<(need-x))//如果剩下的元素个数<需要的数
{
return;
}
b[x]=a[start];//先选择一个
combine(start+1,end,x+1);//再从剩下的集合中选择m-1个
combine(start+1,end,x);//然后再从剩下的集合(即缩小的集合中选择m个)

}

(2)排列:为了列出一个长度为n的字符串的所有排列,可以一次挑选n个字母中的一个;然后在后面列出其余的n-1个字母可能的排列组合。


/*排列函数*/
/*参数:c 为 int 型数组的地址
start 为排列数组的起始下标
end 为排列数组的结束下标+1
*/
void permute(int c[],int start,int end)
{
if(start==end) //挑选完毕
{
/*打印数组*/
for(int i=0;i<end;i++)
{
cout<<c[i]<<" ";
}
cout<<endl;
}
else
{
for(int i=start;i<end;i++)
{
swap(c[i],c[start]);//一次挑选n个字母中的一个
permute(c,start+1,end);//再对其余的n-1个字母一次挑选
swap(c[i],c[start]);//恢复原字符串

}
}
}

问题牵引:在对字符数组进行排序的时候,应当注意传入参数的方式,即 char str[] 和 char * str的区别

    (1)char * str 的str,指向一块内存区域,可以随时改变;但其指向的内容不可以修改

    (2)char str[] 其地址不可改变,即常量指针;但数组内容可以改变

时间: 2024-08-09 06:22:00

排列组合问题(递归实现)的相关文章

排列组合的递归

令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<

用递归写排列组合问题

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

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

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. 一.类循环组合排列 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