递归全排列

本文深入解析了通过递归实现数字全排列的过程,详细解释了编程思想、关键步骤及注意事项,包括如何通过交换和回溯来求解多个数字的全排列。提供了具体的代码实例,帮助读者理解全排列算法的核心逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

}

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值