用递归写排列组合问题
2016-05-09 21:12
375 查看
最近递归弄的人头疼,但是这两天看过来也稍微总结了一些不能称得上是技巧的技巧吧
问题如下,将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...总之先执行最后的那个函数,并输出。。。这个还得慢慢体会
问题如下,将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...总之先执行最后的那个函数,并输出。。。这个还得慢慢体会
相关文章推荐
- 如何在cPanel中创建新MySQL数据库、用户以及设置权限
- LCD1602自定义点阵字符
- JBOSS 6和JBOSS 5搭建多实例方法
- best coder (百度之星) IP聚合
- HDU 3759(暴力映射)
- 正则表达式
- 【bzoj3120】Line dp+矩阵乘法
- 使用scrapy进行大规模抓取(二)
- Android新增API之AudioEffect中文API与应用实例
- 竞态条件与sigsuspend函数
- UVa 156 (stl map的使用)
- 对于gcd欧几里得的拓展
- acm_最大折线分割平面数目
- SOA EDA 事件驱动架构 (Event-Driven Architecture,EDA) 简介
- pkg-config的用法
- JAVA事务处理 之 JDBC事务
- Activity之affinity
- JAVA之路002-运算符
- 红外测温传感器的现状
- c++第五次作业