递归打印全排列

原理解释:

用递归求全排列的思路,设定数字为{5,8,2}

1.让第一个数不同,得到三个数列,其办法是把第一个数和后面的每个数交换

5 8 2                  //把第一个数和第一个交换

8 5 2                 //把第一个数和第二个交换

2 8 5 //把第一个数和第三个交换

以上三个数列,只要第一个数不同,不管后面的n-1个数是怎么排列的,这n个数列都不同。

这是递归的第一层。

2.继续:在上面的每个数列中去掉第一个数,对后面的剩下的数进行类似的排列。

以5 8 2举例

去掉5,对8 2进行排列

8 2

2 8

这是递归的第二层。

重复上述步骤,直到用完所有数字。

数列总个数为个数的阶乘:3!=6

5 8 2
5 2 8
8 5 2
8 2 5
2 8 5
2 5 8
排列总个数:6

下面是代码:

#include <stdio.h>
#include <stdlib.h>
#define Swap(a,b) {int temp = a;a = b;b = temp;}
void quanpailie(int begin,int end,int* num,int data[]);
int main(void)
{
	int data[3] = {5,8,2};							//用来全排列的数组
	int num = 0;									//用来统计全排列的个数
	quanpailie(0,2,&num,data);						//data数组下标 0-2 数组的起点和终点 num用来统计个数 
	printf("排列总个数:%d",num);
	return 0;
}

void quanpailie(int begin,int end,int* num,int sz[])
{
	int i;
	if(begin == end)								//递归结束条件 
	{	
		(*num)++;
		printf("%d %d %d\n",sz[0],sz[1],sz[2]);  	//打印全排列结果看一看			
	}
	else{
		for(i = begin;i <= end;i++)
		{
			Swap(sz[begin],sz[i]);         			//把当前第一个数与后面所有的数交换
			quanpailie(begin+1,end,num,sz);
			Swap(sz[begin],sz[i]);					//恢复用于下一次交换 
		}
	} 
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值