递归求全排列

取出数组中第一个元素放到最后,即a[1]与a[n]交换,然后递归求a[n-1]的全排列

1)如果数组只有一个元素n=1,a={1} 则全排列就是{1}

2)如果数组有两个元素n=2,a={1,2} 则全排列是

{2,1}–a[1]与a[2]交换。交换后求a[2-1]={2}的全排列,归结到1)

{1,2}–a[2]与a[2]交换。交换后求a[2-1]={1}的全排列,归结到1)

3)如果数组有三个元素n=3,a={1,2,3} 则全排列是

{{2,3},1}–a[1]与a[3]交换。后求a[3-1]={2,3}的全排列,归结到2)

{{1,3},2)–a[2]与a[3]交换。后求a[3-1]={1,3}的全排列,归结到2)

{{1,2},3)–a[3]与a[3]交换。后求a[3-1]={1,2}的全排列,归结到2)

以此类推。

马上用C代码实现,成功!

#include <stdio.h>

int g_count = 1;

int g_n = 0;

void print_result(int *a)

{

        int i = 0;

        printf(“count %d:”, g_count++);

        for (i=0; i<g_n; i++)

        {

                printf(” %d”, a[i]);

        }

        printf(“\n”);

        return;

}

#define swap(a, b)\

{\

        int tmp = a;\

        a = b;\

        b = tmp;\

}

void p(int *a, int size)

{

        if (size == 1)

                print_result(a);

        else

        {

                int i, tmp = 0;

                for (i=0; i<size; i++)

                {

                        swap(a[i], a[size-1]);

                        p(a, size-1);

                        swap(a[i], a[size-1]);

                }

     

点赞