最近递归弄的人头疼,但是这两天看过来也稍微总结了一些不能称得上是技巧的技巧吧
问题如下,将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("
");
}
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...总之先执行最后的那个函数,并输出。。。这个还得慢慢体会