全排列

给定一个字符串,递归输出它的全排列

例如:给定一个字符串abcd,我们该如何去书写它的一个全排列?
为了有规律地进行书写,我们一般是先保持第一个a不动,写后面bcd这3个的全排列,
如:bcd的全排列为 bcd bdc bdcbdc bdc bdc
这样的书写方式看起来非常地有规律,易于理解

在用a连接上bcd的全排列,得到的就是a开头产生的全排列

a的全排列
abcd
abdc
abdc
abdc
abdc
abdc

之后再让b到第一个位置,即可以产生b开头的全排列,之后让其中的每一个都到开头的位置即可产生全部的全排列

具体实现的代码如下:

#include<stdio.h>

void swap(char* a, char* b) {

	char temp = *a;
	*a = *b;
	*b = temp;
}

void AllRange(char A[], int i, int k) {

	//当i到末尾的时候可以直接进行输出
	if (i == k) {

		printf("%s\n", A);


	}

	else {

		//进行for循环产生后面的式子
		for (int j = i; j <= k; j++) {

			//进行交换,更换全排列前面的值
			swap(A + i, A + j);

			//递归产生全排列后面的值
			AllRange(A, i + 1, k);

			//重新进行交换,使全排列有序
			swap(A + i, A + j);

		}


	}



}

void main() {

	char A[] = { '0', '1', '2', '3', '\0' };
	
	AllRange(A, 0, 3);

}

对0123这四个的全排列的输出结果如下:
0123
0132
0213
0231
0321
0312
1023
1032
1203
1230
1320
1302
2103
2130
2013
2031
2301
2310
3120
3102
3210
3201
3021
3012

一共有4!种结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值