用递归写排列组合问题

最近递归弄的人头疼,但是这两天看过来也稍微总结了一些不能称得上是技巧的技巧吧

问题如下,将1,2,3,4这四个数字排列组合的输出来,看网上有个很二的方法吧,就是将10000以内的数全部输出再筛选,对此有点无语,但是程序倒是挺好编的,嘿嘿

回归到正题中,用递归的思想解决

(1)采用旋转数字的方法,当步长为1时,1234还是1234,步长为2的时候,1234可以变为1243、1324...,步长为3 的时候,1234可以变为1423,诸如此类,最重要的能体现递归的就是将每次递归一次的数字还可以接着旋转。

#include<stdio.h>
void output(int *p,int count)
{
for(int j=0;j<count;j++)
{
printf("%d",p[j]);
}
printf("\n");
}
void DifferentSort(int *p,int j,int count)
{
if(j<count-1)
{
for(int i=j;i<count;i++)
{
int temp=p[i];
for(int k=i;k>=j;k--)
{
p[k]=p[k-1];
}
p[j]=temp;
DifferentSort(p,j+1,count);
int temp1=p[j];
for(int k1=j;k1<i;k1++)
{
p[k1]=p[k1+1];
}
p[i]=temp1;
}
}
else
{
output(p,count);
}
}
void main()
{
int *p=new int ;
p[0]=1;
p[1]=2;
p[2]=3;
p[3]=4;
DifferentSort(p,0,4);

}

自然最主要的函数就是DifferentSort()函数了

(1)变量j是从第几个开始处理,变量i控制的是处理区域的大小,i-j+1就是所需要处理的数字的个数,k就是将这i-j+1个数旋转的控制变量。j从第0个数开始处理,i从j开始慢慢变大到数组长度。

(2)递归时先执行最后的那个,即j=3的情况,直接输出1234,然后考虑j=2的情况,输出1243,并将p还原为1234,然后考虑j=1的情况p变为1324,然后对此p执行DifferentSort(p,2,count)变为1342,然后先还原为1324再还原为1234;

同理j=0的情况,i=1时,p变为2134,然后对2134执行DifferentSort(p,2,count)先变为2143...总之先执行最后的那个函数,并输出。。。这个还得慢慢体会

时间: 2024-07-31 14:25:48

用递归写排列组合问题的相关文章

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-乐乐' ]

C++写一个排列组合小程序

今天突然想到一个问题,有时候,针对同一个事件有多种反映,特别是游戏AI当中,这种情况下需要采取最适合的方案,哪种方案最适合,可以将每种方案的结果或影响都计算一遍,从而选择最合适的.最基本就是一个排列组合方法,将各种方案都组合出来.于是写了一个基本的N个数排列组合小程序! 开发工具:Visual Studio 2012 CTestPermutation::~CTestPermutation() { cout<<">>>>>>>>>&

排列组合的递归

令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)组合:先从原始数组中选择一个,再从剩下的集合中选择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