递归全排列

来源:互联网 发布:vb 图片保存到数据库 编辑:程序博客网 时间:2024/06/03 16:07

0 1 2 3的全排列:

 

编程思想:如 0 1 2 3 的全排列=0+1 2 3的全排列)+1+0 2 3的全排列)+2+1 0 3的全排列)+3+ 1 2 0的全排列)。

1 2 3 的全排列=1+2 3的全排列)+2+1 3的全排列)+3+1 2的全排列)

在求几个数的全排列时,每次使后面的元素和第一个交换后,再求出剩余元素的全排列。

如 0123 0132 0213 0231 0321 0312   1023 ……

在做时应注意回溯。

 

在之前我没有深刻理解程序是如何走的、、一直做得时错的。

 

建议单步调试,具体看程序每一步是如何走的。如何回溯,如何递归,i是在什么情况下加的,每一个全排列是在什么情况下输出的。

 

 

#include <stdio.h>

void swap(int *a,int *b)

{

  int t;

   t=*a;

  *a=*b;

  *b=t;

}

void pailie( int *a,int b,int c)

{

   int i;

  if(b==c)

        printf("%d %d %d %d\n",a[0],a[1],a[2],a[3]);//输出每一个全排列

  else 

     {

       for(i=b;i<=c;i++)

       {

           swap(&a[i],&a[b]);//确定全排列的这几个数的第一个元素的值

          pailie(a,b+1,c);

           swap(&a[i],&a[b]);//回溯 如 0132 应回溯程 0123 接着继续全排列,即返回到原来的状态

     }

    }

 

}

int main()

{

int a[4]={0,1,2,3},j=0,n=3;

 pailie(a,0,3);

return 0;

}

 

3 0
原创粉丝点击