码迷,mamicode.com
首页 > 其他好文 > 详细

用递归写排列组合问题

时间:2016-05-09 22:07:01      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

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

问题如下,将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...总之先执行最后的那个函数,并输出。。。这个还得慢慢体会

用递归写排列组合问题

标签:

原文地址:http://www.cnblogs.com/yunerlalala/p/5475455.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!