全排列递归方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yongwenn163/article/details/79303201

参考http://blog.csdn.net/axiqia/article/details/50967863

(一)递归的全排列算法

(A、B、C、D)的全排列为

1、A后面跟(B、C、D)的全排列

2、B后面跟(A、C、D)的全排列(A与B交换,其他次序保持不变)

3、C后面跟(B、A、D)的全排列(A与C交换,其他次序保持不变)

4、D后面跟(B、C、A)的全排列(A与D交换,其他次序保持不变)

用数字举例方便点:

1234
1243
1324
1342
1432
1423
2134
….
3214
3214
3241
3124
3142
3412
3421
4231

为观察规律,仅仅标红1234全排列中最高位首次1,2,3,4的排列。

解释:

以1234为基础(代码中第二次交换的意义),同为第一层递归的4种状态分别为:

第一位和第一位交换(1234==》1234);

第一位和第二位交换(1234==》2134);

第一位和第三位交换(1234==》3214);

第一位和第四位交换(1234==》4123)。

为保证普遍性,选第三种状态继续递归:

以3214为基础,同为第二层递归的三种状态分别为:

第二位和第二位交换(3214==》3214);

第二位和第三位交换(3214==》3124);

第二位和第四位交换(3214==》3412)。

继续递归即可。

代码:

#include <stdio.h>
#define COUNT 5
int quanpailie(int k,int buf[],int N);
int dicheng(int count)
{
    int cnt,result=1;
    for(cnt=count;cnt!=0;cnt--)
        result=result*cnt;
    return result;
}
int main(int argc, char** argv) {
    int i;
    int data[COUNT];                                                                                                                                                      
//  printf("Hello world!\n");
    //printf("please input N:\n");
    //scanf("%d",&N);
    printf("there are %d situations:\n",dicheng(COUNT));
    for(i=0;i<COUNT;i++)
    {
        data[i] = i+1; 
    }
    quanpailie(0,data,COUNT);         
    //printf("N is %d\n",N);
    return 0;
}
int quanpailie(int k,int buf[],int N)
{
    int i;
    if(k == N-1)
    {
        for(i=0;i<N;i++)
        {
            printf("%d ",buf[i]);
        }
        printf("\n");       
    }
    else
    {
        for(i=k;i<N;i++)
        {
            int temp=buf[k];
            buf[k]=buf[i];
            buf[i]=temp;
            quanpailie(k+1,buf,N);
            temp=buf[k];
            buf[k]=buf[i];
            buf[i]=temp;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/yongwenn163/article/details/79303201